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.



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...
}

'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);

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);
});

4

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

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

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

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?.


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());
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.