J'ai vu plusieurs suggestions pour nommer des fichiers au hasard, notamment en utilisant
System.IO.Path.GetRandomFileName()
ou en utilisant un
System.Guid
et en ajoutant une extension de fichier.
Ma question est: Quel est le moyen le plus rapide de générer un nom de fichier unique?
Un GUID serait extrêmement rapide, puisque son implémentation garantit que Windows peut générer au moins 16 384 GUIDS en une période de 100 nanosecondes. (Comme d'autres l'ont fait remarquer, les spécifications ne garantissent pas, mais seulement autorisent. Cependant, la génération GUID est vraiment, vraiment rapide. Vraiment.) La probabilité de collision sur un système de fichiers n'importe où sur un réseau est très faible. Il est assez sûr que, bien qu'il soit préférable de toujours vérifier pour voir si ce nom de fichier est disponible, de toute façon, vous n'auriez même jamais besoin de le faire.
Il n'y a donc aucune opération d'E/S sauf la sauvegarde elle-même et <0,2 millisecondes (sur une machine de test) pour générer le nom lui-même. Assez vite.
Vous voulez System.IO.Path.GetTempFileName()
Je ne peux pas vraiment dire si c'est le plus rapide ou pas, mais c'est le bon moyen de le faire, ce qui est plus important.
Si vous contrôlez la destination des fichiers et qu'il n'y a qu'un processus et thread qui y écrit, ajoutez simplement un numéro d'auto-incrémentation à un nom de base.
Si vous ne contrôlez pas la destination ou si vous avez besoin d'une implémentation multithread, utilisez un GUID.
Si vous contrôlez le répertoire, vous pouvez nommer votre fichier en fonction de 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.
Vous pouvez faire quelque chose comme:
file.MoveTo(deletedfilesdir + @"\" + f.Name + **DateTime.Now.ToFileTimeUtc()** + f.Extension);
Utilisez un Int et incrémentez-le pour chaque fichier.
J'espère que cette fonction itérative aidera quelqu'un à générer un nom de fichier unique.
public string getUniqueFileName(int i, string fullpath, string filename)
{
string lstDir = fullpath.Substring(0, fullpath.LastIndexOf('\\'));
string name = Path.GetFileName(fullpath);
string path = fullpath;
if (name != filename)
path = Path.Combine(lstDir, filename);
if (System.IO.File.Exists(path))
{
string ext = Path.GetExtension(name);
name = Path.GetFileNameWithoutExtension(name);
i++;
filename = getUniqueFileName(i, fullpath, name + "_" + i + ext);
}
return filename;
}