2009-08-18 191 views
21

我使用SWT在Java中編寫應用程序。我想創建獨特的文件名。但我不想在硬盤上創建它。附加功能:我想在指定的文件夾中創建唯一的文件名。如何使用創建文件創建tmp文件名

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

如果不創建文件,那麼你的意思是什麼「獨一無二」?你的意思是「與該目錄中的所有其他文件名不同」? – lindelof 2009-08-18 13:08:45

+0

我想創建唯一的文件名:「與該目錄中的所有其他文件名不同「 - 準確地說, – 2009-08-18 13:18:08

+4

@mykhaylo:意識到如果你沒有立即使用你獲得的唯一文件名來創建一個文件,那麼可能會有另一個具有該名稱的文件可能會彈出到existenc即即使提供的一些答案也沒有考慮到這種可能性。 – 2009-08-18 16:16:26

回答

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組合在一起,則任何碰撞的機會都變得非常小。

1

您可以使用任何名稱(時間,GUID等)創建一個文件,然後測試它是否已經存在。如果確實如此,請嘗試使用其他名稱以查看它是否是唯一的。

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

@Nick:在'f.exists()'和'//你很好去'之間'一個具有該名字的文件可以出現在文件系統上。 – 2009-08-18 16:17:23

14

從你的問題我想你已經看到了File.createTempFile()通常會創建一個文件,而不是隻讓你生成的名字。

但是,爲什麼不只是調用方法,然後刪除創建的臨時文件? createTempFile()完成了在指定目錄中查找唯一文件名的所有工作,並且自創建該文件以來,您也一定會將其刪除。

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

@Dave:在'f.delete()'之後,文件名不再保證是唯一的。在刪除由'createTempFile()創建的文件後,在文件系統上會出現另一個具有相同名稱的文件。 – 2009-08-18 16:18:31

+0

@Grant Wagner:的確如此。這就是爲什麼操作需要原子化。如果你只是想產生一個隨機的名字,而不僅僅是用一些隨機數連接時間戳 – polvoazul 2016-08-18 19:28:45

+1

@polvoazul:不幸的是,沒有辦法做@michał-ziober所要求的並且保證文件名在該目錄中仍然沒有被使用。不帶GUID/UUID,不帶時間戳和隨機數。這是不可能的。 @ dave-webb的答案是最接近你的標準(通過調用內置的'File.createTempFile')。刪除文件只是爲了滿足原始問題的限制。 – onlynone 2016-12-13 15:26:08

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

這個過程應該在正常的情況下工作,即使併發。除非我們開始在想佔領我們新目錄或類似的東西嗅探器進程的思想。