Necesito generar un archivo temporal único con una extensión .csv.
Lo que hago ahora es
string filename = System.IO.Path.GetTempFileName().Replace(".tmp", ".csv");
Sin embargo, esto no garantiza que mi archivo .csv sea único.
Sé que las posibilidades de que tenga una colisión son muy bajas (especialmente si consideras que no elimino los archivos .tmp), pero este código no me parece bien.
Por supuesto, podría generar manualmente nombres de archivos aleatorios hasta que finalmente encuentre uno único (que no debería ser un problema), pero tengo curiosidad por saber si otros han encontrado una buena manera de lidiar con este problema.
c#
.net
temporary-files
Brann
fuente
fuente
GetTempFileName()
crea un nuevo archivo cada vez que lo llama. - Si cambia inmediatamente la cadena a otra cosa, acaba de crear un nuevo archivo de cero bytes en su directorio temporal (y, como han señalado otros, esto eventualmente hará que falle cuando golpee 65535 archivos allí ...) - - Para evitar esto, asegúrese de eliminar los archivos que cree en esa carpeta (incluidos los que devuelveGetTempFileName()
, idealmente en un bloque finalmente).Respuestas:
Garantizado para ser (estadísticamente) único:
(Para citar del artículo wiki sobre la probabilidad de una colisión:
EDITAR: Consulte también los comentarios de JaredPar.
fuente
Prueba esta función ...
Devolverá un camino completo con la extensión de su elección.
Tenga en cuenta que no se garantiza que produzca un nombre de archivo único, ya que técnicamente alguien más podría haber creado ese archivo. Sin embargo, las posibilidades de que alguien adivine el próximo guid producido por su aplicación y lo cree es muy, muy bajo. Es bastante seguro asumir que esto será único.
fuente
Guid.NewGuid().ToString() + extension
ni siquiera es correcto, debería serloGuid.NewGuid().ToString() + "." + extension
.txt
o notxt
), pero dado queChangeExtension
maneja ambos casos, no puede dolerNota: esto funciona como Path.GetTempFileName. Se crea un archivo vacío para reservar el nombre del archivo. Realiza 10 intentos, en caso de colisiones generadas por Path.GetRandomFileName ();
fuente
Path.GetRandomFileName()
realidad crea un archivo de cero bytes en el disco y devuelve la ruta completa de ese archivo. No está utilizando este archivo, solo su nombre para cambiar la extensión. Por lo tanto, si no se asegura de eliminar estos archivos temporales, después de 65535 llamadas a esta función, comenzará a fallar.GetTempFileName()
yGetRandomFileName()
.GetTempFileName()
crea un archivo de cero bytes como mi método, peroGetRandomFileName()
no crea un archivo. Desde los documentos:> A diferencia de GetTempFileName, GetRandomFileName no crea un archivo. Su enlace apunta a la página incorrecta.También puede utilizar alternativamente System.CodeDom.Compiler.TempFileCollection .
Aquí usé una extensión txt pero puedes especificar lo que quieras. También configuré el indicador keep en true para que el archivo temporal se mantenga después del uso. Desafortunadamente, TempFileCollection crea un archivo aleatorio por extensión. Si necesita más archivos temporales, puede crear varias instancias de TempFileCollection.
fuente
¿Por qué no verificar si el archivo existe?
fuente
La documentación de MSDN para GetTempFileName de C ++ analiza su inquietud y la responde:
fuente
Qué tal si:
Es muy improbable que la computadora genere el mismo Guid en el mismo instante de tiempo. La única debilidad que veo aquí es el impacto en el rendimiento DateTime.Now.Ticks agregará.
fuente
También puedes hacer lo siguiente
y esto también funciona como se esperaba
fuente
En mi opinión, la mayoría de las respuestas propuestas aquí son subóptimas. El que se acerca más es el original propuesto inicialmente por Brann.
Un nombre de archivo temporal debe ser
Debido a estos requisitos, no es una buena idea programar una bestia por su cuenta. Las personas inteligentes que escriben bibliotecas IO se preocupan por cosas como el bloqueo (si es necesario), etc. Por lo tanto, no veo la necesidad de reescribir System.IO.Path.GetTempFileName ().
Esto, incluso si parece torpe, debería hacer el trabajo:
fuente
File.Move
se elevaIOException
si el archivo de destino ya existe. msdn.microsoft.com/en-us/library/…Esto podría ser útil para ti ... Es crear una temperatura. carpeta y devolverlo como una cadena en VB.NET.
Fácilmente convertible a C #:
fuente
Esto parece funcionar bien para mí: comprueba la existencia del archivo y crea el archivo para asegurarse de que sea una ubicación de escritura. Debería funcionar bien, puede cambiarlo para que devuelva directamente FileStream (que normalmente es lo que necesita para un archivo temporal):
fuente
Función fácil en C #:
fuente
En base a las respuestas que encontré en Internet, llego a mi código de la siguiente manera:
Y como C # Cookbook por Jay Hilyard, Stephen Teilhet señaló en Uso de un archivo temporal en su aplicación :
debe usar un archivo temporal siempre que necesite almacenar información temporalmente para su posterior recuperación.
Lo único que debe recordar es eliminar este archivo temporal antes de que finalice la aplicación que lo creó.
Si no se elimina, permanecerá en el directorio temporal del usuario hasta que el usuario lo elimine manualmente.
fuente
He mezclado @Maxence y @Mitch trigo respuestas teniendo en cuenta Quiero que la semántica del método GetTempFileName (el nombre del archivo es el nombre de un nuevo archivo creado) añadir la extensión preferido.
fuente
Esto es lo que estoy haciendo:
fuente
Esta es una forma simple pero efectiva de generar nombres de archivo incrementales. Buscará en el actual directamente (puede señalarlo fácilmente en otro lugar) y buscará archivos con la base YourApplicationName * .txt (de nuevo, puede cambiarlo fácilmente). Comenzará a las 0000 para que el primer nombre de archivo sea YourApplicationName0000.txt. si por alguna razón hay nombres de archivos con basura entre (partes que no son números) las partes izquierda y derecha, esos archivos serán ignorados en virtud de la llamada de prueba.
fuente
Creo que deberías probar esto:
Genera un nombre de archivo único y crea un archivo con ese nombre de archivo en una ubicación específica.
fuente