2015-11-30 2 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

Проблема, вероятно, связано с тем, что вы используете два различных .Substring методы: String#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 для показа более элегантного способа сделать это. –

Смежные вопросы