2013-03-22 62 views
3

如何在C++中重命名文件?如何使用wstring重命名文件?

rename(tempFileName.c_str(), tempFileName.c_str()+"new.txt"); 

tempFileNamestd::wstring類型。但rename()函數只接受const char*參數。

+5

'tempFileName.c_str()+「new.txt」'顯然是錯誤的。 – wilx 2013-03-22 11:29:21

回答

2

Visual Studio工作,你平時用的寬字符串的工作。爲了重命名文件,你可以使用MoveFileEx-function,你可以像這樣重命名文件。

std::wstring newFilename = tempFileName.c_str(); 
newFilename += _T("new.txt"); 
if(!MoveFileEx(tempFileName.c_str(), newFilename.c_str(), flags)){ 
//error handling if call fails 
} 

查看here的文檔。

+0

'MoveFileEx'需要'const(w)char *'。 LPTCSTR被定義爲'const char *',但我同意使用臨時對象可能有點困難。 – 2013-03-22 11:32:11

+0

@ bash.d請確保您下次發佈正確的內容。這應該是預計從某人近2k代表 – 2013-03-22 11:54:01

+0

行。調試101:如果發生了奇怪的事情,請將問題分開。您正在組裝一個fileSpec,因此您可能已經引入了一個'fileSpec'臨時文件,並在嘗試重命名之前將規範組裝到該文件中。用調試器檢查溫度時,你會發現這是不正確的。 – 2013-03-22 12:00:50

3

由於您的目標是Windows,因此請使用_wrename()函數。

7

在Visual C++中,rename()的寬字符版本是_wrename()。這不是可移植的,但你可能不關心這一點。此外,您不能添加原始字符串的指針一樣,你想是這樣的(未測試):

std::wstring newName(tempFileName); 
newName += L"new.txt"; 
_wrename(tempFileName.c_str(), newName.c_str()); 
+0

但無法重命名文件返回錯誤代碼32 EPIPE – TVSuser1654136 2013-03-22 13:30:26

+0

剛剛嘗試了一個快速示例,它在這裏工作。猜測你要重命名的文件不存在,或者你正在重命名的文件已經存在 - 有時間做一些調試。 – DavidK 2013-03-22 14:55:23

+1

值得注意的是,EPIPE被定義爲32,這也是Windows錯誤代碼ERROR_SHARING_VIOLATION的值(「進程無法訪問文件,因爲它正在被另一進程使用。」)這很可能是它不起作用的原因對於你 - 你已經在其他地方打開了該文件。 – DavidK 2013-03-22 14:58:05