2013-10-15 109 views
1

我在重命名文件時遇到問題。我試圖刪除現有文件的幾行,並將其替換爲新文件。爲什麼我的重命名文件不工作?

string line; 
ifstream myfile(filename); 
ofstream outfile; 
outfile.open(filename.append(".new")); 

if(myfile.is_open()) { 
    //loop here that runs through code and calles 
    //outfile << line; repeatedly 
} 

int test = rename(filename.append(".new").c_str(),filename.c_str()); 
if (test == 0) cout << "Success"; 
else cout << "Failure"; 

從我在網上看到的,我希望它可以創建新文檔,填充它,然後用更新替換原來的。

有沒有人看到我出錯的地方?

+1

在嘗試重命名之前是否關閉了新文件? – usr2564301

+0

請注意(即使在儘可能工作的情況下),如果存在硬鏈接,這可能會失敗 - 當您「刪除」現有文件時,只會從文件名中刪除一個鏈接到內容。鏈接到相同內容的其他名稱仍將鏈接到舊文件,而不是新文件。 –

+0

你在Windows上運行嗎?如果是這樣,在執行重命名之前,您需要確保關閉任何打開的舊文件句柄,否則將失敗,並顯示'ERROR_SHARING_VIOLATION'。或者,也可以使用兼容的共享模式打開文件,但這需要放棄C++'iostream' API來支持諸如['_fsopen()']之類的函數(http://msdn.microsoft.com/en-us/library/ 8f30b0db.aspx)或原始系統調用['CreateFile()'](http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858%28v=vs.85%29.aspx)。 –

回答

4

看起來它失敗了,因爲您仍然打開了這兩個文件。鎖定時很可能無法重命名文件。嘗試重命名之前關閉文件。

此外,您需要刪除原始文件,然後才能重命名。

在僞代碼,這是你需要做什麼:

  • 打開原始文件。
  • 打開臨時.new文件。
  • 執行您所做的任何任務。
  • 關閉這兩個文件。
  • 刪除原始文件。
  • 重命名。

rename調用失敗時,您的C++實現可能會設置errno。因此,您應該檢查errno的值以找出呼叫失敗的原因。請熟悉錯誤報告機制,以便您自己診斷問題。

+0

好的,我包括 myfile.close(); outfile.close(); remove(filename.c_str()); rename(filename.append(「。new」)。c_str(),filename.c_str()); 現在,當我檢查我的目錄時,沒有「.new」文件,只是沒有改變的原始文件。 – user2761933

+0

因此,寫一些不同的文件!看起來你只是在你的循環中複製它。另外,問題是關於爲什麼重新命名的呼叫失敗。我想我肯定會回答這個問題。 –

+0

我正在寫一些與文件不同的東西。我從它刪除了幾行,我只是不想混淆與轉換的具體細節我的帖子,因爲這可能只是重命名文件的問題。重命名仍然失敗,儘管關閉這兩個文件,並假定刪除原來的。 – user2761933

相關問題