我正在尋找獲取指定臨時文件的跨平臺方式。例如,在Linux中將在/tmp
目錄中,並在Windows中的一些蹩腳的命名Internet Explorer臨時目錄中。C++:獲取臨時文件,跨平臺
是否存在一個跨平臺(Boost?)解決方案?
編輯:
我需要這個文件存在,直到程序終止。 tmpfile()
不保證。從ccpreference引述:
創建的臨時文件被自動刪除當流被關閉(FCLOSE)或當在程序正常終止。
我正在尋找獲取指定臨時文件的跨平臺方式。例如,在Linux中將在/tmp
目錄中,並在Windows中的一些蹩腳的命名Internet Explorer臨時目錄中。C++:獲取臨時文件,跨平臺
是否存在一個跨平臺(Boost?)解決方案?
編輯:
我需要這個文件存在,直到程序終止。 tmpfile()
不保證。從ccpreference引述:
創建的臨時文件被自動刪除當流被關閉(FCLOSE)或當在程序正常終止。
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。
這應該被接受 - 'tmpnam'可以是一個攻擊媒介。 – 2014-08-07 14:44:31
unique_path只返回一個文件名。使用boost :: filesystem :: temp_directory_path()/ boost :: filesystem :: unique_path()來獲取完整的臨時路徑名。 – JE42 2016-11-07 04:57:46
對於那些想知道的人:由於可能的競爭條件,'unique_path()'不會成爲'std :: filesystem'的一部分,請參閱https://wg21.cmeerw.net/lwg/msg7747。 – 2017-04-25 14:36:56
您可以使用C標準庫函數tmpfile
。
這對我來說無法解決。我需要保證文件存在,直到程序退出。從ccpreference引用:「當流關閉(fclose)時,創建的臨時文件將自動刪除。」 – orlp 2011-04-07 19:21:33
@nightcracker:好的...所以不要關閉文件流,直到完成使用臨時文件? – 2011-04-07 19:27:30
這不會阻止從外部程序的訪問(這是整個問題,我需要一個臨時文件供其他程序讀取)?我正在考慮使用[tmpnam](http://www.cplusplus.com/reference/clibrary/cstdio/tmpnam/)。 – orlp 2011-04-07 19:28:45
標準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);
與詹姆斯的評論相同:對我來說這不是解決方案。我需要保證文件存在,直到程序退出。從ccpreference引用:「當流關閉(fclose)時,創建的臨時文件將自動刪除。」 – orlp 2011-04-07 19:23:11
使用'tmpnam'也意味着引入競爭條件。 – 2012-01-13 09:33:35
tmpnam也不適用於C++ 14兼容系統,如MSYS2下的GCC 5.4。我不知道什麼是「\ s778」。是一個臨時名稱,除非Windows系統完全不正確。這將是一個目錄路徑,而不是文件路徑。 – 2016-07-05 19:45:25
如果您使用Qt:QTemporaryFile類是完美的。
編輯:由於您似乎喜歡Boost的想法,Robbie Morrison's answer可能對您更好。
我原來的答案仍然在下面,但是任何人都會閱讀:請注意,tmpnam是不安全的。此外,某些平臺(如Windows)可能已經損壞,bug,腦殘或甚至缺少實現。
tmpnam如果你不喜歡tmpfile?
從鏈接:
的文件中創建這種方式,不像那些 用tmpfile建立的不是 關閉時自動刪除;你應該調用remove來刪除這個文件 一旦關閉。
特別是如果您需要另一個程序來知道文件的名稱,這似乎更合適,因爲tmpfile根本不會給你一個名字。
我認爲這不是安全的,但如果這是一個問題。 這是link describing some of those issues。
程序之間的溝通比隨機臨時文件有更好的方法。你可以使用管道進行通訊嗎?使用本地主機套接字怎麼樣?
如果您堅持使用文件,只需讓程序使用一個名稱,可能基於啓動時間。
所以,不要關閉它。 – 2011-04-07 20:02:10
您可否評論如何使用'tmpnam'不符合您的目的? – jwd 2011-05-04 21:21:24
@jwd:沒有 - 對不起,我忘了接受答案。 – orlp 2011-05-05 12:15:58