Obtenir des fichiers par date de création dans .NET

92

J'ai un dossier qui contient de nombreux fichiers. Existe-t-il un moyen simple d'obtenir les noms de fichiers dans le répertoire triés par date / heure de création?

Si j'utilise Directory.GetFiles(), il renvoie les fichiers triés par leur nom de fichier.

Sensé
la source
J'ai trouvé une question similaire: stackoverflow.com/questions/52842/sorting-directory-getfiles
Senseful
4
GetFiles () ne trie pas , les classer par nom est un accident. Faites le tri.
Hans Passant

Réponses:

198

cela pourrait fonctionner pour vous.

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...
}
George Taskos
la source
'System.IO.FileInfo []' ne contient pas de définition pour 'OrderBy'
Umair Jabbar
2
C'est une méthode d'extension ... msdn.microsoft.com/en-us/library/bb383977.aspx
Ivo
12
Je pense qu'il n'est pas nécessaire d'appeler la méthode ToArray ().
Ivo
AnyIdeas sans utiliser de méthodes d'extension / LINQ car je cible .NET 2.0
Pratik
10
Pensez à utiliser info.GetFiles (). OrderBy (p => p.CreationTimeUtc) au lieu de CreationTime s'il y a une chance que les fichiers du répertoire aient été créés dans différents fuseaux horaires (y compris l'heure d'été)
Steve
46

Vous pouvez utiliser Linq

var files = Directory.GetFiles(@"C:\", "*").OrderByDescending(d => new FileInfo(d).CreationTime);
Sev
la source
2
La solution DirectoryInfo est beaucoup plus rapide que celle-ci (en particulier pour le chemin réseau)
jing
8

Si vous ne souhaitez pas utiliser 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);
});
Henrik
la source
4

Cela renvoie la date de la dernière modification et son âge.

DateTime.Now.Subtract(System.IO.File.GetLastWriteTime(FilePathwithName).Date)
BMG
la source
1

@jing: "La solution DirectoryInfo est beaucoup plus rapide que celle-ci (en particulier pour le chemin réseau)"

Je ne peux pas le confirmer. Il semble que Directory.GetFiles déclenche un système de fichiers ou un cache réseau. La première demande prend un certain temps, mais les demandes suivantes sont beaucoup plus rapides, même si de nouveaux fichiers ont été ajoutés. Dans mon test, j'ai fait un Directory.getfiles et un info.GetFiles avec les mêmes modèles et les deux fonctionnent de la même manière

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
Passer
la source
1

Si les performances sont un problème, vous pouvez utiliser cette commande dans MS_DOS:

dir /OD >d:\dir.txt

Cette commande génère un fichier dir.txt dans ** d: ** root pour que tous les fichiers soient triés par date. Et puis lisez le fichier à partir de votre code. De plus, vous ajoutez d'autres filtres par * et?.

grand-hougday
la source
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());
Ata Hoseini
la source