Dosyaları .NET'te oluşturma tarihine göre alma


94

Birçok dosya içeren bir klasörüm var. Dizindeki dosya adlarını oluşturulma tarihine / saatine göre sıralanmış olarak almanın herhangi bir kolay yolu var mı?

Ben kullanırsanız Directory.GetFiles(), bu dosya adına göre sıralanmış dosyaları döndürür.



4
GetFiles () yapar değil sıralama, onları adıyla sipariş alma bir kazadır. Sadece kendinizi sıralayın.
Hans Passant

Yanıtlar:


203

bu sizin için işe yarayabilir.

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' için bir tanım içermiyor
Umair Jabbar

2
Bu bir genişletme yöntemi ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo

14
ToArray () yöntemini çağırmaya gerek olmadığını düşünüyorum.
Ivo

Uzantı yöntemlerini kullanmadan AnyIdeas / LINQ çünkü .NET 2.0'ı hedefliyorum
Pratik

10
Dizindeki dosyaların farklı saat dilimlerinde yaratılmış olma ihtimali varsa (gün ışığından yararlanma saati dahil), CreationTime yerine info.GetFiles (). OrderBy (p => p.CreationTimeUtc) kullanmayı düşünün
Steve

46

Linq'i kullanabilirsiniz

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

2
DirectoryInfo çözümü bundan çok daha hızlıdır (özellikle ağ yolu için)
jing

9

LINQ kullanmak istemiyorsanız

// 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

Bu, son değiştirilme tarihini ve yaşını döndürür.

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

1

@jing: "DirectoryInfo çözümü bundan çok daha hızlıdır (özellikle ağ yolu için)"

Bunu onaylayamıyorum. Görünüşe göre Directory.GetFiles bir dosya sistemini veya ağ önbelleğini tetikliyor. İlk istek biraz zaman alır, ancak yeni dosyalar eklenmiş olsa bile aşağıdaki istekler çok daha hızlıdır. Testimde aynı kalıplara sahip bir Directory.getfiles ve bir info.GetFiles yaptım ve her ikisi de eşit olarak çalışıyor

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

Performans bir sorunsa, bu komutu MS_DOS'ta kullanabilirsiniz:

dir /OD >d:\dir.txt

Bu komut ** d: ** kök dizininde bir dir.txt dosyası oluşturur ve tüm dosyalar tarihe göre sıralanır. Ve sonra dosyayı kodunuzdan okuyun. Ayrıca, * ve? İle başka filtreler eklersiniz.


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());
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.