Отримання файлів за датою створення в .NET


92

У мене є папка, яка містить багато файлів. Чи є простий спосіб отримати імена файлів у каталозі, відсортовані за датою / часом їх створення?

Якщо я використовую Directory.GetFiles(), він повертає файли, відсортовані за їх ім'ям.


Я знайшов таке запитання: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful

4
GetFiles () не сортує, їх упорядкування за назвою є випадковістю. Просто розсортуйся.
Ганс Пасант,

Відповіді:


198

це може працювати для вас.

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'
Умайр Джаббар,

2
Це метод розширення ... msdn.microsoft.com/en-us/library/bb383977.aspx
Іво

12
Я думаю, що немає необхідності викликати метод ToArray ().
Ivo

AnyIdeas без використання методів розширення / LINQ, оскільки я націлююсь на .NET 2.0
Пратік

10
Подумайте про використання info.GetFiles (). OrderBy (p => p.CreationTimeUtc) замість CreationTime, якщо є шанси, що файли в каталозі можуть бути створені в різних часових поясах (включаючи перехід на літній час)
Стів,

46

Ви можете використовувати Linq

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

2
Рішення DirectoryInfo набагато швидше , ніж це (особливо для мережевого шляху)
цзин

8

Якщо ви не хочете використовувати 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 та info.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());
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.