web-dev-qa-db-fra.com

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

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?

29
Dan Esparza

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.

36
Rex M

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.

16
Joel Coehoorn

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.

3
LBushkin

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.

1
Stéphane

Vous pouvez faire quelque chose comme: 

file.MoveTo(deletedfilesdir + @"\" + f.Name + **DateTime.Now.ToFileTimeUtc()** + f.Extension);
0
Haroon

Utilisez un Int et incrémentez-le pour chaque fichier.

0
Tom B

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;
}
0
Bikuz