54 votos

¿Crear un directorio temporal de Windows?

¿Cuál es la mejor manera de entrar un nombre de directorio temporal de Windows? Veo que puedo usar GetTempPath y GetTempFileName para crear un archivo temporal, pero hay algo equivalente a Linux / BSD mkdtemp función para crear un directorio temporal.

102voto

Scott Dorman Puntos 25000

No hay ningún equivalente a mkdtemp. La mejor opción es utilizar una combinación de GetTempPath y GetRandomFileName.

Necesitaría código similar a este:

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

7voto

Matthew Puntos 51

Me gusta usar GetTempPath(), una función de creación GUID como CoCreateGuid() y CreateDirectory().

Un GUID está diseñado para tener una alta probabilidad de singularidad, y también es altamente improbable que alguien crea manualmente un directorio con la misma forma que un GUID (y si lo hacen entonces CreateDirectory() fallará indicando su existencia)

7voto

Steve Jansen Puntos 1990

Yo hack Path.GetTempFileName() a darme una válida, pseudo-aleatorio de la ruta de acceso del archivo en el disco, a continuación, elimine el archivo y crear un directorio con el mismo archivo ruta de acceso.

Esto evita la necesidad de comprobar si la ruta de acceso está disponible en un tiempo o en bucle, por Chris comentario sobre Scott Dorman la respuesta.

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

  return tempFolder;
}

Si usted realmente necesita un sistema de encriptación secure nombre al azar, puede que desee para adaptarse Scott respuesta a usar un while o do loop para seguir tratando de crear una ruta de acceso en el disco.

1voto

Paulo de Barros Puntos 11

Aquí es un poco más de fuerza bruta enfoque para resolver el problema de la colisión de temporales en el directorio de nombres. No es infalible enfoque, pero reduce significativamente las posibilidades de una ruta de carpeta de colisión.

Uno podría agregar otro proceso o la asamblea de la información relacionada con el nombre del directorio para hacer la colisión, incluso menos probable, a pesar de hacer una información visible en el directorio temporal nombre puede no ser deseable. Uno también puede mezclar el orden con el que los relacionados con el tiempo de los campos se combinan para hacer de los nombres de carpeta mirar más al azar. Yo, personalmente, prefiero dejarlo de esa manera, simplemente porque es más fácil para mí encontrar a todos ellos durante la depuración.

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 Puntos 76760

GetTempPath es la forma correcta de hacerlo; No estoy seguro de lo que es su preocupación por este método. Entonces puede utilizar CreateDirectory para hacerlo.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X