2010-02-19 19 views
11

J'ai un dossier avec beaucoup trop de fichiers, et je veux parcourir chaque fichier un par un. Le problème est que Directory.GetFiles renvoie un tableau complété, et cela prend trop de temps.Avoir Directory.GetFiles retourne un fichier à la fois? (.NET)

Je préfère avoir un objet que je pointerais vers un dossier, puis appeler une fonction qui me renvoie le fichier suivant dans le dossier. Est-ce que .NET a une classe comme celle-ci s'il vous plait?

(je préfère éviter INTEROPS win32, comme je l'intention d'utiliser sur Mono aussi bien.)

Un grand merci.

Répondre

8

Vous ne pouvez pas le faire dans .NET 3.5, mais vous pouvez en .NET 4.0, as per this blog post:

DirectoryInfo directory = new DirectoryInfo(@"\\share\symbols"); 
IEnumerable<FileInfo> files = directory.EnumerateFiles(); 
foreach (var file in files) { 
    Console.WriteLine("Name={0}, Length={1}", file.Name, file.Length); 
} 

(. De même, il y a une méthode Directory.EnumerateFiles statique)

Je ne sais pas si cette API a déjà été portée sur Mono.

+0

juste une question, pourquoi ne pas utiliser: var files = directory.EnumerateFiles(); ? –

+1

@Filip: Je ne connais pas les raisons de Jon, mais j'utiliserais le nom du type pour plus de clarté car il n'est pas évident d'après le nom de la méthode quel type il renvoie. –

+0

@Fredrik, n'est-ce pas assez clair qu'il va retourner une liste d'informations de fichier énumérable? Le nom de la méthode est vraiment auto-explicatif. Il en va de même pour DirectoryInfo, je préfère utiliser var directory = ... Je sais qu'il y a une différence au moment de la compilation. –

1

Jetez un oeil au projet FastDirectoryEnumerator sur le site Web de CodeProject.

Il fait exactement ce dont vous avez besoin et même plus, j'ai pu l'utiliser avec succès sur un partage réseau lent avec beaucoup de fichiers et la performance était tout simplement géniale. Inconvénient - il utilise Interop donc il peut ne pas être portable pour Mono.

+0

Merci, je peux finir par l'utiliser, mais revenant à Directory.GetFiles s'il lance une exception d'interopérabilité, indiquant que je ne suis probablement pas sur win32. – billpg

+1

Vous pouvez utiliser 'Environment.OSVersion' pour déterminer si vous utilisez Windows ou non et trouver un autre code qui fonctionnera rapidement sur le système d'exploitation que vous ciblez. –