152 votos

¿Cómo puedo crear un archivo temporal con una extensión específica con .net?

Necesito generar un archivo temporal único con 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 (sobre todo si se tiene en cuenta que no borro los archivos .tmp), pero este código no me parece bueno.

Por supuesto, podría generar manualmente nombres de archivo aleatorios hasta que encuentre uno único (lo que no debería ser un problema), pero tengo curiosidad por saber si otros han encontrado una buena manera de resolver este problema.

206voto

Mitch Wheat Puntos 169614

Se garantiza que es (estadísticamente) único:

string fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv";

(Citando el artículo de la wiki sobre la probabilidad de colisión:

...el riesgo anual de ser alcanzado por un meteorito se estima en una probabilidad entre 17.000 millones [19], lo que significa la probabilidad es de aproximadamente 0,00000000006 (6 × 10-11), lo que equivale a las probabilidades de crear unas decenas de trillones de UUID en un año y tener un duplicado. En otras palabras, sólo después de generar 1.000 millones de UUID cada segundo durante los próximos 100 años, la probabilidad de crear un solo duplicado sería de aproximadamente el 50%. La probabilidad de un duplicado sería alrededor del 50% si cada persona en la tierra posee 600 millones de UUIDs

EDIT: Por favor, vea también los comentarios de JaredPar.

32voto

JaredPar Puntos 333733

Prueba esta función...

public static string GetTempFilePathWithExtension(string extension) {
  var path = Path.GetTempPath();
  var fileName = Guid.NewGuid().ToString() + extension;
  return Path.Combine(path, fileName);
}

Devolverá una ruta completa con la extensión que usted elija.

Tenga en cuenta que no está garantizado que produzca un nombre de archivo único, ya que técnicamente otra persona podría haber creado ya ese archivo. Sin embargo, las posibilidades de que alguien adivine el siguiente guid producido por tu aplicación y lo cree son muy muy bajas. Es bastante seguro asumir que será único.

24voto

Maxence Puntos 5619
public static string GetTempFileName(string extension)
{
    string fileName;
    int attempt = 0;
    bool exit = false;
    do
    {
        fileName = Path.GetRandomFileName();
        fileName = Path.ChangeExtension(fileName, extension);
        fileName = Path.Combine(Path.GetTempPath(), fileName);

        try
        {
            using (new FileStream(fileName, FileMode.CreateNew)) {}

            exit = true;
        }
        catch (IOException ex)
        {
            if (++attempt == 10) 
                throw new IOException("No unique temporary file name is available.", ex);
        }

    } while (!exit);

    return fileName;
}

Nota: esto funciona como Path.GetTempFileName. Se crea un archivo vacío para reservar el nombre del archivo. Hace 10 intentos, en caso de colisiones generadas por Path.GetRandomFileName();

16voto

Mehmet Aras Puntos 3901

También puede utilizar alternativamente System.CodeDom.Compiler.TempFileCollection .

string tempDirectory = @"c:\\temp";
TempFileCollection coll = new TempFileCollection(tempDirectory, true);
string filename = coll.AddExtension("txt", true);
File.WriteAllText(Path.Combine(tempDirectory,filename),"Hello World");

Aquí he utilizado una extensión txt pero puedes especificar la que quieras. También puse la bandera de mantener a true para que el archivo temporal se mantenga después de su uso. Desafortunadamente, TempFileCollection crea un archivo aleatorio por extensión. Si necesitas más archivos temporales, puedes crear múltiples instancias de TempFileCollection.

7voto

Matías Puntos 3008

¿Por qué no se comprueba si el archivo existe?

string fileName;
do
{
    fileName = System.IO.Path.GetTempPath() + Guid.NewGuid().ToString() + ".csv";
} while (System.IO.File.Exists(fileName));

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