2009-08-18 13 views
21

J'écris une application en Java en utilisant SWT. Je voudrais créer un nom de fichier unique. Mais je ne veux pas le créer sur disque dur. Fonctionnalité supplémentaire: Je souhaite créer un nom de fichier unique dans le dossier spécifié.Comment créer un nom de fichier tmp sans créer de fichier

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

Si vous ne créez pas le fichier "Voulez-vous dire" différent de tous les autres noms de fichier dans ce répertoire "? – lindelof

+0

Je voudrais créer un nom de fichier unique:" différent de tous les autres noms de fichiers dans ce répertoire " "- exactement –

+4

@mykhaylo: Réalisez que si vous ne créez pas immédiatement un fichier en utilisant le nom de fichier unique que vous obtenez, il est possible qu'un autre fichier portant ce nom apparaisse dans e. Même certaines des réponses fournies ne tiennent pas compte de cette possibilité. –

Répondre

7

Utilisez un horodatage dans le nom de fichier?

Bien sûr, cela peut ne pas fonctionner si vous avez une concurrence d'accès très élevée.

Par exemple:

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(); 
} 

comme la réponse de John Oxley suggère. UUID peut être une solution car vous pouvez utiliser 4 schémas différents pour les créer. Bien qu'il y ait encore une petite chance de collision. Si vous combinez un horodatage avec un UUID aléatoire, les risques de collision deviennent minimes.

3

Vous pouvez essayer d'utiliser un GUID pour le nom du fichier.

1

Vous pouvez créer un fichier avec n'importe quel nom (heure, GUID, etc.), puis le tester pour voir s'il existe déjà. Si c'est le cas, essayez un autre nom pour voir s'il est unique.

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

@Nick: entre 'f.exists()' et '// vous êtes prêt à partir 'un fichier avec ce nom pourrait apparaître sur le système de fichiers. –

14

Je suppose que vous avez vu à travers votre question que File.createTempFile() toujours crée un fichier plutôt que de simplement vous permettant de générer le nom.

Mais pourquoi ne pas simplement appeler la méthode, puis supprimer le fichier temporaire créé? createTempFile() fait tout le travail dans la recherche d'un nom de fichier unique dans le répertoire spécifié et depuis que vous avez créé le fichier, vous pouvez vous assurer de le supprimer aussi.

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

@Dave: Après 'f.delete()' le nom du fichier n'est plus garanti d'être unique. Juste après avoir supprimé celui créé par 'createTempFile()' un autre fichier avec le même nom pourrait apparaître sur le système de fichiers. –

+0

@Grant Wagner: Exactement. C'est pourquoi l'opération doit être atomique. Si vous voulez juste générer un nom aléatoire plutôt que de concaténer l'horodatage avec quelques nombres aléatoires – polvoazul

+1

@polvoazul: Malheureusement, il n'y a aucun moyen de faire ce que demande @ michał-ziober et de garantir que le nom de fichier n'est toujours pas utilisé dans ce répertoire. Pas avec GUID/UUID, pas avec les horodatages et les nombres aléatoires. Ce n'est simplement pas possible. La réponse de @ dave-webb est la plus proche de la norme (en appelant le fichier 'File.createTempFile' intégré). La suppression du fichier après n'est effectuée que pour satisfaire aux contraintes de questions d'origine. – onlynone

1

Une autre version,

simplifié les autres réponses, utilisation GUID. imho pas besoin d'ajouter sel à UUID. C'est ce que j'utilise:

public static String getUniqueFileName(String directory, String extension) { 
    String fileName = MessageFormat.format("{0}.{1}", UUID.randomUUID(), extension.trim()); 
    return Paths.get(directory, fileName).toString(); 
} 
  • Notez que le fichier n'est pas créé, cette fonction retourne juste un nom de fichier unique en tant que chaîne

utilisation

:

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

sortie

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

Vous pouvez créer un répertoire unique réel (sous-répertoire), puis n'importe quel fichier à l'intérieur devrait être unique, par exemple "myFile"."+ Extension

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; 
    } 

cette procédure devrait fonctionner dans les scénarios normaux, même avec la concurrence. À moins que nous commençons à penser dans les processus renifleurs qui veulent occuper notre nouveau choses répertoire ou similaires.

Questions connexes