如何生成唯一的文件名或路徑?我正在尋找一種適用於Unix(類似)操作系統和Windows的解決方案。如何生成唯一的文件名或路徑?
回答
兩者都使用mktemp。 Windows已經得到了的posix調用版本,而linux調用是mktemp(3)。 mktemp的在Linux的命令行工具只是偶然調用
最簡單的方法:產生一個隨機數,並使用其十六進制值作爲文件名(除非該文件存在,在這種情況下,您創建一個新的)。最簡單的方法2:如果您只需要一些不存在的文件,請使用數字(或其十六進制值)作爲文件名或其中的一部分,您只需增加數字直到不存在具有該名稱的文件已經。
更復雜的方式:生成一個GUID並將其用作文件名(再次驗證它沒有被使用)。
您可以獲取當前時間戳並將其用作文件名。或者只是將最後一個文件名增加1.
例如1.txt,2.txt等。
使用C庫函數tmpfile
或tmpnam
。兩者都存在於windows和linux下。
但要小心,當使用tmpfile時,它會在關閉程序時自動刪除,所以也許tmpnam
更適合您。
從tmpnam的Linux手冊頁面:「不要使用此函數,而應使用mkstemp(3)或tmpfile(3)」。 – 2012-08-16 08:36:09
@ ThomasPadron-McCarthy:你說得對,當有人在獲取名字和打開文件之間「劫持」你的文件時,可能存在安全問題。通常如果是臨時文件,tmpfile是獲取的方式。但在這種情況下,用戶可能希望使其具有持久性。和mkstemp我不敢肯定,如果它在Windows下可用。 – flolo 2012-08-16 08:43:03
這是Linux的問題,而不是'tmpnam'。如果正確實施,沒有理由不使用'tmpnam'。(公平地說,它很少以安全的方式實現,但'mkstemp'是Unix,而不是標準C,'tmpfile'不僅創建了一個名字,而且還以'FILE *'的形式打開了文件,這使得它非常漂亮沒用。) – 2012-08-16 08:43:51
使用boost::uuid
:
#include <string>
using std::string;
#include <boost/lexical_cast.hpp>
using boost::lexical_cast;
#include <boost/uuid/uuid.hpp>
using boost::uuids::uuid;
#include <boost/uuid/uuid_generators.hpp>
using boost::uuids::random_generator;
#include <boost/uuid/uuid_io.hpp>
string make_uuid()
{
return lexical_cast<string>((random_generator())());
}
,並使用生成的UUID作爲文件名(路徑是不相關的,因此)。
但是這會*保證*唯一的文件名並處理競爭條件? – 2012-08-16 09:18:16
@ Component10,來自鏈接的文檔:當UUID由其中一個定義的機制生成時,它們要麼保證是唯一的,與所有其他生成的UUID不同(也就是說,它以前從未生成過,它永遠不會生成再次),或者極有可能是獨特的(取決於機制)。所以對你的問題的確切答案是它不是100%保證的。不過,我已經使用了這段時間很長一段時間,並且_never_發生了衝突。 – hmjd 2012-08-16 09:22:45
一致認爲,由於uuid的範圍,我正在迂腐。 :)我在這裏看到的主要問題是如何確保您的文件在打開時尚不存在。關於這個問題的討論可以在這裏找到[http://stackoverflow.com/questions/9874002/how-to-create-a-file-only-if-it-doesnt-exist],但顯然你做的更獨特該文件的名稱,如在你的答案中,這種情況發生的可能性較小。 – 2012-08-16 09:47:22
正如別處提到的那樣,有tmpnam
。它通常執行得不好,以便與其他進程競爭。然而,在典型的單用戶機器上,這通常是足夠的。
在我自己的代碼,我通常會先創建一個目錄,進程ID 作爲名稱的一部分,並安排把我所有的臨時文件在它 (使用一個簡單的計數器來改變文件名);在共享磁盤上,我想 也將處理器ID打包到目錄名稱中(但我傾向於將 臨時文件放在本地非共享驅動器上,這樣可以避免大部分 問題)。
- 1. 如何爲Tk頂層窗口路徑生成唯一名稱?
- 2. 生成唯一的臨時文件路徑
- 3. MPMediaItem生成唯一的文件名
- 4. 生成唯一的文件名
- 5. 生成一個文件名列表,但沒有文件路徑
- 6. MarkLogic:如何生成唯一的文檔/ xml文件名
- 7. 從文件名生成唯一散列
- 8. 如何爲上傳的圖片生成唯一的文件名
- 9. 如何爲django模型生成唯一的文件名.FileField
- 10. 如何使用jfilechooser生成唯一的文件名?
- 11. 使用Polymorphic回形針生成一個唯一的文件路徑
- 12. Rails:如何生成路徑?
- 13. GEt唯一的文件名而不是整個路徑
- 14. Directory.GetFiles:如何獲取唯一的文件名,而不是完整的路徑?
- 15. 生成唯一名稱?
- 16. 如何篩選文件路徑,然後使用生成的路徑
- 17. path.getrandomfilename是否會每次生成一個唯一的文件名?
- 18. Python工具生成一個唯一的臨時文件名
- 19. TFS生成錯誤 - 「指定的路徑,文件名或兩者都太長...」
- 20. 新的文件(路徑)或class.getResourses(路徑)?
- 21. 如何提取路徑的文件名
- 22. 生成隨機文件路徑Java
- 23. setImageResource從生成文件路徑
- 24. 在圖庫中生成文件路徑?
- 25. 使用Maven生成類路徑文件
- 26. 將唯一文件路徑轉換爲唯一整數
- 27. 重命名,刪除或更改路徑文件的成本
- 28. 文件路徑名稱或URL分析
- 29. 從fstream獲取文件名(或路徑)
- 30. 路徑,目錄和/或文件名
Ouuh..Does存在任何獨特corossplatform的解決方案,它產生像類似於在我的Debian發行版在臨時目錄的名稱上WIN_ – pandreym 2012-08-16 08:50:51
名,男子3 mktemp的指示,而不是使用mkstemp ,因爲mktemp是安全風險 – pandreym 2012-08-16 08:52:18
名稱{XXXX_XXXX_XXXX_XXXX ..}和等 – Colin 2014-10-23 22:57:18