Recupero dei file per data di creazione in .NET


92

Ho una cartella che contiene molti file. Esiste un modo semplice per ottenere i nomi dei file nella directory ordinati in base alla data / ora di creazione?

Se lo uso Directory.GetFiles(), restituisce i file ordinati in base al nome del file.



4
GetFiles () non ordina, farli ordinare per nome è un incidente. Metti in ordine te stesso.
Hans Passant

Risposte:


198

questo potrebbe funzionare per te.

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 []" non contiene una definizione per "OrderBy"
Umair Jabbar

2
È un metodo di estensione ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo

12
Penso che non sia necessario chiamare il metodo ToArray ().
Ivo

AnyIdeas senza utilizzare metodi di estensione / LINQ perché sto prendendo di mira .NET 2.0
Pratik

10
Prendi in considerazione l'uso di info.GetFiles (). OrderBy (p => p.CreationTimeUtc) invece di CreationTime se c'è qualche possibilità che i file nella directory possano essere stati creati in fusi orari diversi (inclusa l'ora legale)
Steve

46

Puoi usare Linq

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

2
La soluzione DirectoryInfo è molto più veloce di questa (specialmente per il percorso di rete)
jing

8

Se non vuoi usare 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

Restituisce la data dell'ultima modifica e la sua età.

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

1

@jing: "La soluzione DirectoryInfo è molto più veloce di questa (soprattutto per il percorso di rete)"

Non posso confermarlo. Sembra che Directory.GetFiles attivi un filesystem o una cache di rete. La prima richiesta richiede un po 'di tempo, ma le richieste seguenti sono molto più veloci, anche se sono stati aggiunti nuovi file. Nel mio test ho eseguito un Directory.getfiles e un info.GetFiles con gli stessi schemi ed entrambi funzionano allo stesso modo

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

Se le prestazioni sono un problema, puoi utilizzare questo comando in MS_DOS:

dir /OD >d:\dir.txt

Questo comando genera un file dir.txt in ** d: ** root che ha tutti i file ordinati per data. E poi leggi il file dal tuo codice. Inoltre, aggiungi altri filtri per * e?.


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());
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.