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? ?
Réponses
Trop de publicités?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;
}
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.
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.)
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);
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.