Подтвердить что ты не робот

Как создать имя файла tmp без создания файла

Я пишу приложение на Java с помощью SWT. Я хотел бы создать уникальное имя файла. Но я не хочу создавать его на жестком диске. Дополнительная функциональность: я хочу создать уникальное имя файла в папке с указанием.

public String getUniqueFileName(String directory, String extension) {
        //create unique file name   
}
4b9b3361

Ответ 2

Из вашего вопроса я предполагаю, что вы видели, что File.createTempFile() всегда создает файл, а не просто позволяет вам генерировать имя.

Но почему бы просто не вызвать метод, а затем удалить созданный временный файл? createTempFile() выполняет всю работу по поиску уникального имени файла в указанном каталоге, а так как вы создали файл, вы также можете его удалить.

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

Ответ 3

Использовать временную метку в имени файла?

Конечно, это может не сработать, если у вас очень высокий concurrency.

Например:

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

Как объясняет Джон Оксли. UUID может быть решением, поскольку вы можете использовать 4 разных схемы для их создания. Хотя есть еще небольшой шанс столкновения. Если вы комбинируете временную метку со случайным UUID, вероятность любого столкновения становится исчезающе малой.

Ответ 4

Вы можете попробовать использовать GUID для имени файла.

Ответ 5

Вы можете создать файл с любым именем (время, GUID и т.д.), а затем проверить его, чтобы узнать, существует ли он. Если это так, попробуйте другое имя, чтобы узнать, уникально ли оно.

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

Ответ 6

Другая версия,

Упростите другие ответы, Использовать GUID. Имхо не нужно добавлять соль к UUID. Это то, что я использую:

public static String getUniqueFileName(String directory, String extension) {
    String fileName = MessageFormat.format("{0}.{1}", UUID.randomUUID(), extension.trim());
    return Paths.get(directory, fileName).toString();
}
  • обратите внимание, что файл не создается, эта функция просто возвращает уникальное имя файла как строку

использование:

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

Выход

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

Ответ 7

вы можете создать фактический уникальный каталог (подкаталог), а затем любой файл внутри он должен быть уникальным, например "myFile". + расширение

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

эта процедура должна работать в обычных сценариях даже с concurrency. Если мы не начнем думать о снифферных процессах, которые хотят занять наш новый каталог или подобные вещи.