รับไฟล์ตามวันที่สร้างใน. NET


94

ฉันมีโฟลเดอร์ที่มีไฟล์มากมาย มีวิธีง่ายๆในการรับชื่อไฟล์ในไดเร็กทอรีที่เรียงตามวันที่ / เวลาที่สร้างหรือไม่?

ถ้าฉันใช้Directory.GetFiles()มันจะส่งคืนไฟล์ที่เรียงตามชื่อไฟล์


ฉันพบคำถามที่คล้ายกัน: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful

4
GetFiles () ไม่เรียงลำดับการสั่งซื้อตามชื่อถือเป็นอุบัติเหตุ เพียงแค่เรียงลำดับตัวเอง
Hans Passant

คำตอบ:


203

สิ่งนี้สามารถใช้ได้กับคุณ

using System.Linq;

DirectoryInfo info = new DirectoryInfo("PATH_TO_DIRECTORY_HERE");
FileInfo[] files = info.GetFiles().OrderBy(p => p.CreationTime).ToArray();
foreach (FileInfo file in files)
{
    // DO Something...
}

'System.IO.FileInfo []' ไม่มีคำจำกัดความสำหรับ 'OrderBy'
Umair Jabbar

2
เป็นวิธีการขยาย ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo

14
ฉันคิดว่าไม่จำเป็นต้องเรียกเมธอด ToArray ()
Ivo

AnyIdeas โดยไม่ใช้วิธีการขยาย / LINQ เพราะฉันกำหนดเป้าหมาย. NET 2.0
Pratik

10
พิจารณาใช้ info.GetFiles () OrderBy (p => p.CreationTimeUtc) แทน CreationTime หากมีโอกาสที่ไฟล์ในไดเรกทอรีอาจถูกสร้างขึ้นในเขตเวลาที่ต่างกัน (รวมถึงเวลาออมแสง)
สตีฟ

47

คุณสามารถใช้ Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);

2
โซลูชัน DirectoryInfo นั้นเร็วกว่ามาก (โดยเฉพาะสำหรับเส้นทางเครือข่าย)
jing

9

หากคุณไม่ต้องการใช้ LINQ

// Get the files
DirectoryInfo info = new DirectoryInfo("path/to/files"));
FileInfo[] files = info.GetFiles();

// Sort by creation-time descending 
Array.Sort(files, delegate(FileInfo f1, FileInfo f2)
{
    return f2.CreationTime.CompareTo(f1.CreationTime);
});

4

สิ่งนี้จะส่งคืนวันที่แก้ไขล่าสุดและอายุ

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)

1

@jing: "โซลูชัน DirectoryInfo เร็วกว่านี้มาก (โดยเฉพาะสำหรับเส้นทางเครือข่าย)"

ฉันไม่สามารถยืนยันสิ่งนี้ได้ ดูเหมือนว่า Directory.GetFiles จะทริกเกอร์ระบบไฟล์หรือแคชเครือข่าย คำขอแรกใช้เวลาสักครู่ แต่คำขอต่อไปนี้จะเร็วกว่ามากแม้ว่าจะมีการเพิ่มไฟล์ใหม่ก็ตาม ในการทดสอบของฉันฉันทำ Directory.getfiles และข้อมูล GetFiles ด้วยรูปแบบเดียวกันและทั้งสองทำงานเท่ากัน

GetFiles  done 437834 in00:00:20.4812480
process files  done 437834 in00:00:00.9300573
GetFiles by Dirinfo(2)  done 437834 in00:00:20.7412646

1

หากประสิทธิภาพเป็นปัญหาคุณสามารถใช้คำสั่งนี้ใน MS_DOS:

dir /OD >d:\dir.txt

คำสั่งนี้สร้างไฟล์dir.txtใน ** d: ** root ซึ่งมีไฟล์ทั้งหมดที่เรียงลำดับตามวันที่ จากนั้นอ่านไฟล์จากรหัสของคุณ นอกจากนี้คุณยังเพิ่มตัวกรองอื่น ๆ โดย * และ?


0
            DirectoryInfo dirinfo = new DirectoryInfo(strMainPath);
            String[] exts = new string[] { "*.jpeg", "*.jpg", "*.gif", "*.tiff", "*.bmp","*.png", "*.JPEG", "*.JPG", "*.GIF", "*.TIFF", "*.BMP","*.PNG" };
            ArrayList files = new ArrayList();
            foreach (string ext in exts)
                files.AddRange(dirinfo.GetFiles(ext).OrderBy(x => x.CreationTime).ToArray());
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.