32 votes

C #: Quel est le moyen le plus rapide pour générer un nom de fichier unique?

J'ai vu plusieurs suggestions sur la façon de nommer les fichiers de manière aléatoire, notamment en utilisant

 System.IO.Path.GetRandomFileName()
 

ou en utilisant un

 System.Guid
 

et ajouter une extension de fichier.

Ma question est: quel est le moyen le plus rapide pour générer un nom de fichier unique?

39voto

Rex M Points 80372

Un GUID serait extrêmement rapide, puisque c'est la mise en œuvre des garanties de Windows peut générer au moins 16,384 GUID dans un de 100 nanosecondes laps de temps. (Comme d'autres l'ont souligné, la spec n'est pas garantie, il permet seulement. Cependant, la génération de GUID est vraiment, vraiment rapide. Vraiment.) La probabilité de collision sur n'importe quel système de fichiers n'importe où sur n'importe quel réseau est très faible. C'est assez sûr que, même s'il serait préférable de toujours vérifier pour voir si le nom de fichier est disponible de toute façon, en réalité, vous ne même pas besoin de le faire.

Si vous cherchez à pas d'opérations d'e/S à l'exception de la sauver elle-même, et <0,2 millisecondes (sur une machine de test) pour générer le nom lui-même. Assez vite.

16voto

Joel Coehoorn Points 190579

Vous voulez System.IO.Path.GetTempFileName()

Je ne peux pas vraiment dire si c'est le plus rapide ou non, mais c'est la bonne façon de le faire, ce qui est plus important.

7voto

Jordan Points 73

Eh bien, j'ai été l'écriture de pilotes de système de fichiers pour 20 ans et serait de dire que Rex est correct. Générer un guid est beaucoup, beaucoup plus rapide, car il nécessite beaucoup moins de ressources que la recherche d'un nom de fichier unique. GetTempFileName crée un fichier, ce qui signifie qu'il doit appeler à travers l'ensemble de la pilote du système de fichiers de la pile (qui sait combien d'appels qui seraient et un commutateur en mode noyau.) GetRandomFileName sonne comme il est plus rapide, cependant je ne ferais confiance le GUID appel à être encore plus rapide. Ce que les gens ne réalisent pas est que même en testant l'existence d'un fichier nécessite un appel complet par le biais de la pile de pilotes. Il en résulte fait dans un cadre ouvert, obtenir les attributs et les proches (qui est au moins 3 appels, selon le niveau.) En réalité, c'est un minimum de 20 appels de fonction et d'une transition vers le mode noyau. GUID de la garantie de l'unicité est assez bon pour la plupart des besoins.

Ma recommandation est de générer le nom et créer un fichier seulement si il n'existe pas. Si elle le fait, lancer une exception et de l'attraper, puis générer un nouveau guid et essayez de nouveau. De cette façon, vous avez aucune chance de faire des erreurs et peut dormir tranquille la nuit.

Sur une note de côté, la vérification des erreurs est tellement surfait. Le Code doit être conçu de manière à bloquer si les hypothèses sont fausses, ou de capturer des exceptions et de traiter avec elle alors. Son beaucoup plus vite à la push et pop et l'adresse sur la pile d'exception, que de vérifier à chaque fois sur chaque fonction pour une erreur.

4voto

LBushkin Points 60611

Si vous contrôlez la destination où les fichiers seront situés, et qu'il n'y a qu'un seul processus et thread qui y écrit, ajoutez simplement un numéro d'incrémentation automatique à un nom de base.

Si vous ne contrôlez pas la destination ou avez besoin d'une implémentation multithread, utilisez un GUID.

1voto

Stéphane Points 21

Si vous contrôlez le répertoire, vous pouvez nommer votre fichier en fonction du lastWriteTime:

 DirectoryInfo info = new DirectoryInfo(directoryPath);
long uniqueKey = info.LastWriteTime.Ticks+1L;
string filename = String.Format("file{0}.txt", key);
 

Mais vous devez vérifier les performances de ce code: je suppose que la construction d'un DirectoryInfo n'est pas gratuite.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X