2009-08-18 35 views
21

SWTを使用してJavaでアプリケーションを作成します。一意のファイル名を作成したいと思います。しかし、私はハードドライブにそれを作成したくありません。追加機能:指定したフォルダに一意のファイル名を作成したいファイルを作成してtmpファイル名を作成する方法

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

ファイルを作成しない場合"ユニーク"とはどういう意味ですか? "そのディレクトリ内の他のファイル名と異なるのですか?" – lindelof

+0

"そのディレクトリ内の他のすべてのファイル名とは異なる固有のファイル名を作成します。 " - 正確に。 –

+4

@mykhaylo:あなたが取得している一意のファイル名を使用してファイルをすぐに作成しないと、その名前を持つ別のファイルがexistencにポップする可能性があるe。提供された回答の中にはこの可能性を説明していないものもあります。 –

答えて

7

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

もちろん、並行性が非常に高い場合は、これが機能しないことがあります。例えば

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とタイムスタンプを組み合わせると、衝突の可能性はほとんどなくなります。

3

あなたは、ファイル名にGUIDを使用して試みることができます。

1

任意の名前(時刻、GUIDなど)でファイルを作成し、それがすでに存在するかどうかをテストすることができます。そうであれば、それが一意であるかどうかを見るために別の名前を試してください。あなたの質問から

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

@Nick: 'f.exists()'と '//あなたはうまくいく 'の間に、その名前のファイルがファイルシステムに現れる可能性があります。 –

14

私はあなたがFile.createTempFile()がいつもいうだけで、あなたが名前を生成することができよりファイルを作成することを見てきたと仮定します。

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

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

@Dave: 'f.delete()'の後にファイル名が一意であることが保証されなくなりました。 'createTempFile()'によって作成されたものを削除した直後に、同じ名前の別のファイルがファイルシステム上に現れる可能性があります。 –

+0

@Grant Wagner:まさに。そういうわけで、操作は原子的である必要があります。タイムスタンプをいくつかの乱数で連結するだけでなく、ランダムな名前を生成したい場合は – polvoazul

+1

@polvoazul:残念ながら、@michał-zioberがファイル名がまだそのディレクトリで使用されていないことを確認して保証する方法はありません。 GUID/UUIDではなく、タイムスタンプや乱数ではありません。それだけでは不可能です。 @ dave-webbの答えは、(File.createTempFileの組み込み関数を呼び出すことによって)標準に近づくことになります。後のファイルの削除は、元の質問の制約を満たすためにのみ行われます。 – onlynone

1

別バージョン 、他の回答を簡素化

使用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 
0

実際の一意のディレクトリ(サブディレクトリ)を作成すると、その中のファイル は一意である必要があります(例: "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; 
    } 

この手順は、さらに、同時実行して、通常のシナリオで動作するはずです。私たちは、新しいディレクトリまたは類似のものを占有したいスニファ過程で考え始めなければ。

関連する問題