152 votes

Créer un répertoire temporaire sous Windows?

Quel est le meilleur moyen d'obtenir un nom de répertoire temporaire dans Windows? Je vois que je peux utiliser GetTempPath et GetTempFileName pour créer un fichier temporaire, mais existe-t-il un équivalent de la fonction Linux / BSD mkdtemp de création d'un répertoire temporaire? ?

280voto

Scott Dorman Points 25000

Non, il n'y a pas d'équivalent à mkdtemp. La meilleure option consiste à utiliser une combinaison de GetTempPath et GetRandomFileName .

Vous auriez besoin d'un code similaire à ceci:

 public string GetTemporaryDirectory()
{
   string tempDirectory = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
   Directory.CreateDirectory(tempDirectory);
   return tempDirectory;
}
 

29voto

Steve Jansen Points 1990

Je bidouille Path.GetTempFileName() de me donner un valide, pseudo-aléatoire chemin du fichier sur le disque, puis supprimez le fichier, et de créer un répertoire avec le même chemin d'accès au fichier.

Cela évite la nécessité de vérifier si le chemin d'accès est disponible dans une boucle, par Chris commentaire sur Scott Dorman réponse.

public string GetTemporaryDirectory()
{
  string tempFolder = Path.GetTempFileName();
  File.Delete(tempFolder);
  Directory.CreateDirectory(tempFolder);

  return tempFolder;
}

Si vous avez vraiment besoin d'un point de vue cryptographique sécurisé nom aléatoire, vous pouvez adapter Scott réponse à utiliser une boucle do continuer d'essayer de créer un chemin d'accès sur le disque.

8voto

Matthew Points 51

J'aime utiliser GetTempPath (), une fonction de création de GUID telle que CoCreateGuid () et CreateDirectory ().

Un GUID est conçu pour avoir une forte probabilité d'unicité et il est également hautement improbable que quelqu'un crée manuellement un répertoire avec le même formulaire qu'un GUID (et si c'est le cas, CreateDirectory () échouera en indiquant son existence.)

1voto

Paulo de Barros Points 11

Voici un peu plus de force brute approche de résolution de collision problème temporaire des noms de répertoire. Il n'est pas infaillible, mais il réduit considérablement les chances d'un chemin d'accès au dossier de collision.

On pourrait éventuellement ajouter d'autres processus ou à l'assemblée de l'information relative pour le nom du répertoire à faire, la collision est encore moins probable que, même si une telle information visible sur le répertoire temporaire nom pourrait ne pas être souhaitable. On peut aussi mélanger l'ordre avec lequel le temps de champs sont combinés pour rendre le dossier des noms de regarder de plus aléatoire. Personnellement, je préfère laisser de cette façon, tout simplement parce qu'il est plus facile pour moi de trouver tous les cours de débogage.

string randomlyGeneratedFolderNamePart = Path.GetFileNameWithoutExtension(Path.GetRandomFileName());

string timeRelatedFolderNamePart = DateTime.Now.Year.ToString()
                                 + DateTime.Now.Month.ToString()
                                 + DateTime.Now.Day.ToString()
                                 + DateTime.Now.Hour.ToString()
                                 + DateTime.Now.Minute.ToString()
                                 + DateTime.Now.Second.ToString()
                                 + DateTime.Now.Millisecond.ToString();

string processRelatedFolderNamePart = System.Diagnostics.Process.GetCurrentProcess().Id.ToString();

string temporaryDirectoryName = Path.Combine( Path.GetTempPath()
                                            , timeRelatedFolderNamePart 
                                            + processRelatedFolderNamePart 
                                            + randomlyGeneratedFolderNamePart);

-1voto

Will Points 76760

GetTempPath est la bonne façon de le faire. Je ne suis pas sûr de votre préoccupation à propos de cette méthode. Vous pouvez ensuite utiliser CreateDirectory pour le créer.

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