2009-08-18 17 views
21

Escribo la aplicación en Java usando SWT. Me gustaría crear un nombre de archivo único. Pero no quiero crearlo en el disco duro. Funcionalidad adicional: deseo crear un nombre de archivo único en la carpeta especificada.Cómo crear el nombre de archivo tmp sin crear el archivo

public String getUniqueFileName(String directory, String extension) { 
     //create unique file name 
} 
+0

Si no lo hace crear el archivo , ¿qué quiere decir exactamente por "único"? ¿Quiere decir, "diferente de todos los demás nombres de archivo en ese directorio"? – lindelof

+0

Me gustaría crear un nombre de archivo único: "diferente de todos los demás nombres de archivo en ese directorio "- exactamente. –

+4

@mykhaylo: Date cuenta de que si no creas inmediatamente un archivo usando el nombre de archivo único que estás obteniendo existe la posibilidad de que otro archivo con ese nombre pueda aparecer en existenc mi. Incluso algunas de las respuestas proporcionadas no tienen en cuenta esta posibilidad. –

Respuesta

7

¿Utiliza una marca de tiempo en el nombre de archivo?

Por supuesto, esto puede no funcionar si tiene una concurrencia muy alta.

Por ejemplo:

public String getUniqueFileName(String directory, String extension) { 
    return new File(directory, new StringBuilder().append("prefix") 
     .append(date.getTime()).append(UUID.randomUUID()) 
     .append(".").append(extension).toString()).getAbsolutePath(); 
} 

como la respuesta de John Oxley sugiere. UUID puede ser una solución ya que puede usar 4 esquemas diferentes para crearlos. Aunque todavía hay una pequeña posibilidad de una colisión. Si combina una marca de tiempo con un UUID aleatorio, las posibilidades de una colisión se hacen infinitamente pequeñas.

3

Usted podría intentar usar un GUID para el nombre del archivo.

1

Puede crear un archivo con cualquier nombre (hora, GUID, etc.) y luego probarlo para ver si ya existe. Si lo hace, pruebe con otro nombre para ver si es único.

File f = new File(guid); 
if (f.exists()) { 
    //try another guid 
}else{ 
    //you're good to go 
} 
+5

@Nick: entre 'f.exists()' y '// está listo para ir', un archivo con ese nombre podría aparecer en el sistema de archivos. –

14

Desde su pregunta que asumen que usted ha visto que File.createTempFile() siempre crea un archivo en lugar de simplemente que le permite generar el nombre.

¿Pero por qué no simplemente llamar al método y luego eliminar el archivo temporal creado? createTempFile() hace todo el trabajo para encontrar un nombre de archivo único en el directorio especificado y desde que creó el archivo, puede estar seguro de que también lo eliminará.

File f = File.createTempFile("prefix",null,myDir); 
String filename = f.getName(); 
f.delete(); 
+11

@Dave: después de 'f.delete()' ya no se garantiza que el nombre del archivo sea único. Inmediatamente después de eliminar el creado por 'createTempFile()' podría aparecer otro archivo con el mismo nombre en el sistema de archivos. –

+0

@Grant Wagner: Exactamente. Es por eso que la operación debe ser atómica. Si solo desea generar un nombre aleatorio que simplemente concatenar marca de tiempo con algunos números aleatorios – polvoazul

+1

@polvoazul: Desafortunadamente no hay forma de hacer lo que @michał-ziober está pidiendo y garantizar que el nombre de archivo aún no se use en ese directorio. No con GUID/UUID, no con marcas de tiempo y números aleatorios. Simplemente no es posible. La respuesta de @ dave-webb es lo más cercano que va a llegar a un estándar (llamando al archivo 'File.createTempFile' incorporado). Eliminar el archivo después solo se hace para satisfacer las restricciones de las preguntas originales. – onlynone

1

otra versión,

simplificado las otras respuestas, Uso GUID. no es necesario agregar sal a UUID. Esto es lo que estoy usando:

public static String getUniqueFileName(String directory, String extension) { 
    String fileName = MessageFormat.format("{0}.{1}", UUID.randomUUID(), extension.trim()); 
    return Paths.get(directory, fileName).toString(); 
} 
  • nota de que el archivo no se está creando, esta función sólo devuelve un nombre de archivo único como cadena

uso:

String uniqueFileName = getUniqueFileName("/tmp", "pdf"); 
System.out.println(uniqueFileName); 

salida

/tmp/f34a960a-6001-44d6-9aa7-93ec6647a64a.pdf 
0

puede crear un directorio único real (subdirectorio) y, a continuación, cualquier archivo dentro de él debe ser único, por ejemplo "myFile"."+ Extensión

public static String getUniqueFileName(String directory, String extension) { 
    try 
    { 
     // create actual unique subdirectory in the given directory 
     // 
     File myUniqueDir = File.createTempFile("udir", null,directory); 
     String filename = myUniqueDir.getName(); 
     myUniqueDir.delete(); // don't want the file but a directory 
     myUniqueDir.mkdirs(); 
    } 
    //todo: catch .... 

    // for example: 
    return directory + "/" + myUniqueDir + "/myFile." + extension; 
    } 

este procedimiento debe trabajar en escenarios normales, incluso con la concurrencia. A menos que comencemos a pensar en los procesos de rastreadores que quieren ocupar nuestro nuevo directorio o cosas similares.

Cuestiones relacionadas