web-dev-qa-db-fra.com

Comment créer un nom de fichier temporaire sans créer de fichier

J'écris l'application en Java en utilisant SWT. Je voudrais créer un nom de fichier unique. Mais je ne veux pas le créer sur le disque dur. Fonctionnalité supplémentaire: Je souhaite créer un nom de fichier unique dans Spécifier le dossier .

public String getUniqueFileName(String directory, String extension) {
        //create unique file name   
}
25
Michał Ziober
22
John Oxley

De votre question, je suppose que vous avez vu cela File.createTempFile() crée toujours un fichier plutôt que de simplement vous permettre de générer le nom.

Mais pourquoi pas seulement appeler la méthode, puis supprimer le fichier temporaire créé? createTempFile() Est-ce que tous les travaux de recherche d'un nom de fichier unique dans le répertoire spécifié et que vous avez créé le fichier, vous pouvez être sûr de le supprimer aussi.

File f = File.createTempFile("prefix",null,myDir);
String filename = f.getName();
f.delete();
13
Dave Webb

Utilisez un horodatage dans le nom de fichier?

Bien sûr, cela ne fonctionne pas si vous avez très haute concurrence.

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

La réponse de AS John Oxley suggère. UUID peut être une solution que vous pouvez utiliser 4 différents schémas pour les créer. Bien qu'il y ait encore une petite chance d'une collision. Si vous combinez un horodatage avec un UUID aléatoire les chances de toute collision devient infinitésimale.

6
Rich Seller

Vous pouvez essayer d'utiliser un [~ # ~] guid [~ # ~ ~] pour le nom du fichier.

3
JonnyD

Une autre version,

Simplifié les autres réponses, tilisez 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 en cours de création, cette fonction renvoie simplement un nom de fichier unique en tant que chaîne.

usage:

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

sortir

/tmp/f34a960a-6001-44d6-9aa7-93ec6647a64a.pdf
3
Jossef Harush

vous pouvez créer un répertoire unique unique (sous-répertoire), puis tout fichier à l'intérieur doit ê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 des scénarios normaux, même avec une concurrence. À moins que nous ne commencions à penser à des processus de renifleur qui souhaitent occuper notre nouveau répertoire ou notre nouvelle affaire.

1
elxala

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
}
1
Nick

Utilisation de Path API disponible à partir de Java 7 Vous pouvez générer un fichier de chemin temporaire avec un nom généré de manière unique.

La classe utilitaire Files offre Files.createTempFile , qui fonctionne de la même manière que File.createTempFile, sauf qu'il produit un objet de chemin

Alors appeler la méthode

Path baseDir = ...
Files.createTempFile(baseDir, "status-log-", ".log");
//                 //dir path, prefix      , suffix

Produira quelque chose de similaire à

C:\...\status-log-4746781128777680321.log

Si vous souhaitez ouvrir le fichier et le supprimer après l'avoir terminé, vous pouvez utiliser DELETE_ON_CLOSE, pris de la DOCS:

Comme avec les méthodes de fichier.Createtempfile, cette méthode ne fait qu'une partie d'une installation temporaire. Lorsqu'il est utilisé comme fichiers de travail, le fichier résultant peut être ouvert à l'aide de l'option Supprimer_on_close de sorte que le fichier soit supprimé lorsque la méthode de fermeture appropriée est invoquée. Alternativement, un crochet d'arrêt ou le mécanisme File.DeleeEonxit peut être utilisé pour supprimer le fichier automatiquement.

1
svarog