2011-04-07 163 views
33

我正在尋找獲取指定臨時文件的跨平臺方式。例如,在Linux中將在/tmp目錄中,並在Windows中的一些蹩腳的命名Internet Explorer臨時目錄中。C++:獲取臨時文件,跨平臺

是否存在一個跨平臺(Boost?)解決方案?

編輯

我需要這個文件存在,直到程序終止。 tmpfile()不保證。從ccpreference引述:

創建的臨時文件被自動刪除當流被關閉(FCLOSE)或當在程序正常終止。

+1

所以,不要關閉它。 – 2011-04-07 20:02:10

+1

您可否評論如何使用'tmpnam'不符合您的目的? – jwd 2011-05-04 21:21:24

+0

@jwd:沒有 - 對不起,我忘了接受答案。 – orlp 2011-05-05 12:15:58

回答

65

Boost Filesystem可以使用該庫的版本3創建臨時文件名。它還提供了一個清晰的解決方案。事實上,下面的C++代碼應該是獨立於平臺:

// Boost.Filesystem VERSION 3 required 
#include <string> 
#include <boost/filesystem.hpp> 
boost::filesystem::path temp = boost::filesystem::unique_path(); 
const std::string tempstr = temp.native(); // optional 

文件系統路徑對象temp可以用來打開文件或創建一個子目錄,而字符串對象tempstr提供了相同的信息串。有關更多詳細信息,請參閱http://www.boost.org

+2

這應該被接受 - 'tmpnam'可以是一個攻擊媒介。 – 2014-08-07 14:44:31

+13

unique_path只返回一個文件名。使用boost :: filesystem :: temp_directory_path()/ boost :: filesystem :: unique_path()來獲取完整的臨時路徑名。 – JE42 2016-11-07 04:57:46

+1

對於那些想知道的人:由於可能的競爭條件,'unique_path()'不會成爲'std :: filesystem'的一部分,請參閱https://wg21.cmeerw.net/lwg/msg7747。 – 2017-04-25 14:36:56

4

您可以使用C標準庫函數tmpfile

+0

這對我來說無法解決。我需要保證文件存在,直到程序退出。從ccpreference引用:「當流關閉(fclose)時,創建的臨時文件將自動刪除。」 – orlp 2011-04-07 19:21:33

+1

@nightcracker:好的...所以不要關閉文件流,直到完成使用臨時文件? – 2011-04-07 19:27:30

+0

這不會阻止從外部程序的訪問(這是整個問題,我需要一個臨時文件供其他程序讀取)?我正在考慮使用[tmpnam](http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/)。 – orlp 2011-04-07 19:28:45

5

標準C庫包含一個名爲tmpfile功能,它可能做你所需要的:http://www.cplusplus.com/reference/clibrary/cstdio/tmpfile/

可以在C++程序中使用它。

編輯:
如果您只需要文件名,你可以使用tmpnam,它不會刪除該文件時FCLOSE被調用。它返回完整的文件路徑,包括臨時目錄。

的C方式:

const char *name = tmpnam(NULL); // Get temp name 
FILE *fp = fopen(name, "w"); // Create the file 
// ... 
fclose(fp); 
remove(name); 
+0

與詹姆斯的評論相同:對我來說這不是解決方案。我需要保證文件存在,直到程序退出。從ccpreference引用:「當流關閉(fclose)時,創建的臨時文件將自動刪除。」 – orlp 2011-04-07 19:23:11

+5

使用'tmpnam'也意味着引入競爭條件。 – 2012-01-13 09:33:35

+0

tmpnam也不適用於C++ 14兼容系統,如MSYS2下的GCC 5.4。我不知道什麼是「\ s778」。是一個臨時名稱,除非Windows系統完全不正確。這將是一個目錄路徑,而不是文件路徑。 – 2016-07-05 19:45:25

2

編輯:由於您似乎喜歡Boost的想法,Robbie Morrison's answer可能對您更好。

我原來的答案仍然在下面,但是任何人都會閱讀:請注意,tmpnam是不安全的。此外,某些平臺(如Windows)可能已經損壞,bug,腦殘或甚至缺少實現。


tmpnam如果你不喜歡tmpfile?

從鏈接:

的文件中創建這種方式,不像那些 用tmpfile建立的不是 關閉時自動刪除;你應該調用remove來刪除這個文件 一旦關閉。

特別是如果您需要另一個程序來知道文件的名稱,這似乎更合適,因爲tmpfile根本不會給你一個名字。

我認爲這不是安全的,但如果這是一個問題。 這是link describing some of those issues

+2

從linux上的GCC:警告:'tmpnam'的使用是危險的,更好的使用'mkstemp' - 但我想mkstemp不是交錯佈局。 – 2011-09-28 13:34:56

+0

@André:對於原始問題的約束,'mkstemp'與'tmpfile'有相同的問題 - 它只是給你一個文件句柄。但是你說得對,'tmpnam'是不安全的,正如所指出的那樣。 – jwd 2011-09-28 17:30:25

+0

來自debian文檔:BUGS不要使用這個函數。改爲使用mkstemp(3)或tmpfile(3)。 – malat 2013-11-26 14:52:16

0

程序之間的溝通比隨機臨時文件有更好的方法。你可以使用管道進行通訊嗎?使用本地主機套接字怎麼樣?

如果您堅持使用文件,只需讓程序使用一個名稱,可能基於啓動時間。