¿Cuál es la mejor manera de obtener un nombre de directorio temporal en Windows? Veo que puedo usar GetTempPath
y GetTempFileName
crear un archivo temporal, pero ¿hay algún equivalente a la función Linux / BSD mkdtemp
para crear un directorio temporal?
c#
.net
windows
temporary-directory
Josh Kelley
fuente
fuente
Respuestas:
No, no hay equivalente a mkdtemp. La mejor opción es usar una combinación de GetTempPath y GetRandomFileName .
Necesitarías un código similar a este:
fuente
Hackeo
Path.GetTempFileName()
para darme una ruta de archivo válida y seudoaleatoria en el disco, luego elimino el archivo y creo un directorio con la misma ruta de archivo.Esto evita la necesidad de verificar si la ruta del archivo está disponible en un momento o ciclo, según el comentario de Chris sobre la respuesta de Scott Dorman.
Si realmente necesita un nombre aleatorio criptográficamente seguro, es posible que desee adaptar la respuesta de Scott para usar un tiempo o hacer un bucle para seguir intentando crear una ruta en el disco.
fuente
Me gusta usar GetTempPath (), una función de creación de GUID como CoCreateGuid () y CreateDirectory ().
Un GUID está diseñado para tener una alta probabilidad de unicidad, y también es muy improbable que alguien cree manualmente un directorio con la misma forma que un GUID (y si lo hacen, CreateDirectory () fallará indicando su existencia).
fuente
@Chris. Yo también estaba obsesionado con el riesgo remoto de que un directorio temporal ya pudiera existir. Las discusiones sobre aleatorio y criptográficamente fuerte tampoco me satisfacen por completo.
Mi enfoque se basa en el hecho fundamental de que el O / S no debe permitir 2 llamadas para crear un archivo para que ambos tengan éxito. Es un poco sorprendente que los diseñadores de .NET opten por ocultar la funcionalidad de la API Win32 para los directorios, lo que lo hace mucho más fácil, ya que devuelve un error cuando intenta crear un directorio por segunda vez. Esto es lo que uso:
Puede decidir si el "costo / riesgo" del código de p / invoke no administrado lo vale. La mayoría diría que no, pero al menos ahora tienes una opción.
CreateParentFolder () se deja como un ejercicio para el alumno. Yo uso Directory.CreateDirectory (). Tenga cuidado al obtener el padre de un directorio, ya que es nulo cuando está en la raíz.
fuente
Usualmente uso esto:
Si desea estar absolutamente seguro de que este nombre de directorio no existirá en la ruta temporal, debe verificar si este nombre de directorio único existe e intentar crear otro si realmente existe.
Pero esta implementación basada en GUID es suficiente. No tengo experiencia con ningún problema en este caso. Algunas aplicaciones de MS también usan directorios temporales basados en GUID.
fuente
GetTempPath es la forma correcta de hacerlo; No estoy seguro de cuál es su preocupación sobre este método. Luego puede usar CreateDirectory para hacerlo.
fuente
Aquí hay un enfoque algo más de fuerza bruta para resolver el problema de colisión de los nombres de directorio temporales. No es un enfoque infalible, pero reduce significativamente las posibilidades de una colisión de ruta de carpeta.
Potencialmente, se podría agregar otra información relacionada con el proceso o el ensamblaje al nombre del directorio para que la colisión sea aún menos probable, aunque hacer que dicha información sea visible en el nombre del directorio temporal podría no ser deseable. También se podría mezclar el orden con el que se combinan los campos relacionados con el tiempo para hacer que los nombres de las carpetas se vean más aleatorios. Personalmente prefiero dejarlo así simplemente porque me es más fácil encontrarlos todos durante la depuración.
fuente
Como se mencionó anteriormente, Path.GetTempPath () es una forma de hacerlo. También puede llamar a Environment.GetEnvironmentVariable ("TEMP") si el usuario tiene configurada una variable de entorno TEMP.
Si está planeando usar el directorio temporal como un medio para conservar los datos en la aplicación, probablemente debería considerar usar IsolatedStorage como un repositorio para la configuración / estado / etc ...
fuente