2015-11-30 115 views
2

我正在嘗試保存一些數據的備份。如果備份存在,我想刪除它,給最新的文件備份文件的名稱,然後將新文件保存爲最新的文件。刪除的文件仍然存在?

我遇到的問題是,當我刪除一個現有的文件,我仍然不能保存同名的另一個文件。系統仍認爲該文件存在,並且實際上該文件在程序拋出異常的位置不會被刪除,即使這兩行緊接在一起。我能想到的唯一的事情就是移動操作想要執行的時候,「刪除」操作還沒有時間完成。但我不知道如何解決它。

代碼看起來像這樣。

File.Delete(filePath.Substring(filePath.Length - 4) + ".bak"); 
File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak"); 

我想在以後才能執行移動功能設定一個計時器,但在我看來,這很可能是處理問題的一個非常草率和危險的方式。另外,人們需要等待的時間可能因系統而異。所以我在想,一定有更好的辦法。

+6

我覺得FilePath在File.Delete方法中是不正確的。你能檢查路徑是否正確? – Baskar

+3

嘗試先移動文件,然後從原始位置刪除最新的文件http://stackoverflow.com/questions/5704982/file-move-fails-when-preceded-by-a-file-delete – keyboardP

回答

2

這個問題有可能做的事實,你使用兩種不同的方法.SubstringString#Substring(int)String#Substring(int,int)。確實:

File.Delete(filePath.Substring(filePath.Length - 4) + ".bak"); 
//     ^with one int 
File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak"); 
//       ^with two ints 

不幸的是,這兩者在語義上並不相同。 one with one int是開始索引。因此,鑑於filePath等於test.txt,您要刪除的文件是.txt.bak,接下來您的目標是將文件移動到test.bak。或與Mono的C#模擬器運行以下命令:

csharp> String filePath = "test.txt"; 
csharp> filePath.Substring(filePath.Length - 4) + ".bak" 
".txt.bak" 
csharp> filePath.Substring(0, filePath.Length - 4) + ".bak" 
"test.bak" 

請更新:

File.Delete(filePath.Substring(0,filePath.Length - 4) + ".bak"); 
//     ^added zero 
File.Move(filePath, filePath.Substring(0, filePath.Length - 4) + ".bak"); 

另一種更優雅且不易出錯的方式顯然是使用一個變量之間,使得你確定,你在談論同一個文件:

String backupfile = filePath.Substring(0, filePath.Length - 4) + ".bak"; 
File.Delete(backupfile); 
File.Move(filePath,backupfile); 

最後,不建議做通路處理自己:使用專用的方法來連結和操作文件路徑。

1

我試着用一點點改變你的代碼,它工作正常。我只是改變了你如何定義的備份文件的名稱,因爲文件擴展名可以多於或少於3個字符:

string backupPath = Path.GetFileNameWithoutExtension(filePath) + ".bak"; 
File.Delete(backupPath); 
File.Move(filePath, backupPath); 

但是,如果它不爲你工作,嘗試重命名爲讓說,「備份* .bak2「,然後刪除那個。

希望可以幫助...

+0

實際上,它不' t工作:OP使用兩個語義不同的'String#SubString'版本... –

+1

@CommuSoft你說得對。這是因爲我的「小」改變... –

+0

好的。 +1顯示更優雅的方式來執行此操作。 –

相關問題