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
}
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();
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.
Vous pouvez essayer d'utiliser un [~ # ~] guid [~ # ~ ~] pour le nom du fichier.
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();
}
usage:
String uniqueFileName = getUniqueFileName("/tmp", "pdf");
System.out.println(uniqueFileName);
sortir
/tmp/f34a960a-6001-44d6-9aa7-93ec6647a64a.pdf
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.
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
}
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.