web-dev-qa-db-ja.com

ファイルを作成せずに一時ファイル名を作成する方法

Java SWTを使用してアプリケーションを記述します。一意のファイル名を作成したいのですが、ハードドライブに作成したくありません。追加機能:指定フォルダに一意のファイル名を作成したい。

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

あなたの質問から、私はあなたが File.createTempFile() は単に名前を生成することを許可するのではなく常にファイルを作成することを見たことがあると思います。

しかし、なぜメソッドを呼び出してから、作成された一時ファイルを削除しないのですか? createTempFile()は、指定されたディレクトリで一意のファイル名を見つけるためのすべての作業を行います。ファイルを作成したので、ファイルを削除することもできます。

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

ファイル名にタイムスタンプを使用しますか?

もちろん、同時実行性が非常に高い場合、これは機能しない可能性があります。

例えば:

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

AS John Oxleyの回答が示唆しています。 [〜#〜] uuid [〜#〜] は、4つの異なるスキームを使用して作成できるため、解決策になる場合があります。まだ衝突の可能性はわずかですが。タイムスタンプとランダムなUUIDを組み合わせると、衝突が発生する可能性はほとんどなくなります。

6
Rich Seller

ファイル名に [〜#〜] guid [〜#〜] を使用してみてください。

3
JonnyD

別のバージョン、

他の回答を簡略化GUIDを使用。 imho UUIDsaltを追加する必要はありません。これは私が使っているものです:

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
3
Jossef Harush

実際に一意のディレクトリ(サブディレクトリ)を作成すると、その中のファイルはすべて、たとえば「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;
  }

この手順は、並行性があっても通常のシナリオで機能するはずです。新しいディレクトリまたは同様のものを占有するスニファープロセスで考え始めない限り。

1
elxala

任意の名前(時間、GUIDなど)でファイルを作成し、それをテストして、すでに存在するかどうかを確認できます。存在する場合は、別の名前を試して、一意かどうかを確認してください。

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

Java 7 から利用可能なパスAPI)を使用して、一意に生成された名前で一時パスファイルを生成できます。

Filesユーティリティクラスは Files.createTempFile を提供します。これは、Pathオブジェクトを生成することを除いて、File.createTempFileと同様に機能します。

したがって、メソッドを呼び出す

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

に似たものを生成します

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

ファイルを開いて、ファイルの使用後に削除したい場合は、ドキュメントから取得したDELETE_ON_CLOSEを使用できます。

File.createTempFileメソッドと同様に、このメソッドは一時ファイル機能の一部にすぎません。作業ファイルとして使用する場合、結果のファイルはDELETE_ON_CLOSEオプションを使用して開くことができるため、適切なcloseメソッドが呼び出されたときにファイルが削除されます。あるいは、shutdown-hook、またはFile.deleteOnExitメカニズムを使用して、ファイルを自動的に削除することもできます。

1
svarog