2012-08-16 68 views

回答

4

兩者都使用mktemp。 Windows已經得到了的posix調用版本,而linux調用是mktemp(3)。 mktemp的在Linux的命令行工具只是偶然調用

+0

Ouuh..Does存在任何獨特corossplatform的解決方案,它產生像類似於在我的Debian發行版在臨時目錄的名稱上WIN_ – pandreym 2012-08-16 08:50:51

+0

名,男子3 mktemp的指示,而不是使用mkstemp ,因爲mktemp是安全風險 – pandreym 2012-08-16 08:52:18

+0

名稱{XXXX_XXXX_XXXX_XXXX ..}和等 – Colin 2014-10-23 22:57:18

0
  • 最簡單的方法:產生一個隨機數,並使用其十六進制值作爲文件名(除非該文件存在,在這種情況下,您創建一個新的)。最簡單的方法2:如果您只需要一些不存在的文件,請使用數字(或其十六進制值)作爲文件名或其中的一部分,您只需增加數字直到不存在具有該名稱的文件已經。

  • 更復雜的方式:生成一個GUID並將其用作文件名(再次驗證它沒有被使用)。

-1

您可以獲取當前時間戳並將其用作文件名。或者只是將最後一個文件名增加1.
例如1.txt,2.txt等。

0

使用C庫函數tmpfiletmpnam。兩者都存在於windows和linux下。

但要小心,當使用tmpfile時,它會在關閉程序時自動刪除,所以也許tmpnam更適合您。

+2

從tmpnam的Linux手冊頁面:「不要使用此函數,而應使用mkstemp(3)或tmpfile(3)」。 – 2012-08-16 08:36:09

+0

@ ThomasPadron-McCarthy:你說得對,當有人在獲取名字和打開文件之間「劫持」你的文件時,可能存在安全問題。通常如果是臨時文件,tmpfile是獲取的方式。但在這種情況下,用戶可能希望使其具有持久性。和mkstemp我不敢肯定,如果它在Windows下可用。 – flolo 2012-08-16 08:43:03

+0

這是Linux的問題,而不是'tmpnam'。如果正確實施,沒有理由不使用'tmpnam'。(公平地說,它很少以安全的方式實現,但'mkstemp'是Unix,而不是標準C,'tmpfile'不僅創建了一個名字,而且還以'FILE *'的形式打開了文件,這使得它非常漂亮沒用。) – 2012-08-16 08:43:51

5

使用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作爲文件名(路徑是不相關的,因此)。

+1

但是這會*保證*唯一的文件名並處理競爭條件? – 2012-08-16 09:18:16

+0

@ Component10,來自鏈接的文檔:當UUID由其中一個定義的機制生成時,它們要麼保證是唯一的,與所有其他生成的UUID不同(也就是說,它以前從未生成過,它永遠不會生成再次),或者極有可能是獨特的(取決於機制)。所以對你的問題的確切答案是它不是100%保證的。不過,我已經使用了這段時間很長一段時間,並且_never_發生了衝突。 – hmjd 2012-08-16 09:22:45

+0

一致認爲,由於uuid的範圍,我正在迂腐。 :)我在這裏看到的主要問題是如何確保您的文件在打開時尚不存在。關於這個問題的討論可以在這裏找到[http://stackoverflow.com/questions/9874002/how-to-create-a-file-only-if-it-doesnt-exist],但顯然你做的更獨特該文件的名稱,如在你的答案中,這種情況發生的可能性較小。 – 2012-08-16 09:47:22

1

正如別處提到的那樣,有tmpnam。它通常執行得不好,以便與其他進程競爭。然而,在典型的單用戶機器上,這通常是足夠的。

在我自己的代碼,我通常會先創建一個目錄,進程ID 作爲名稱的一部分,並安排把我所有的臨時文件在它 (使用一個簡單的計數器來改變文件名);在共享磁盤上,我想 也將處理器ID打包到目錄名稱中(但我傾向於將 臨時文件放在本地非共享驅動器上,這樣可以避免大部分 問題)。

+0

在我的代碼中,我將生成像const__string-pid @主機 – pandreym 2012-08-16 08:55:49

+0

這樣的名稱但我需要更多獨特的.. – pandreym 2012-08-16 08:56:23

+1

@ user1602627你是什麼意思「更獨特「?名稱可以是唯一的,也可以不是。你可以生成你想要的任何名字,在各種各樣的信息中加入,如進程ID,用戶ID,時間(如果你想要的話,以微秒爲單位),機器MAP地址等等。拋出你讀過的一些字節如果你願意,也可以從'/ dev/random'。 – 2012-08-16 10:11:23

相關問題