Удаленный файл все еще существует?

Я пытаюсь сохранить резервную копию некоторых данных. Если резервная копия существует, я хочу удалить ее, дать самому последнему файлу имя файла резервной копии, а затем сохранить новый файл как самый последний файл.

Проблема, с которой я сталкиваюсь, состоит в том, что, когда я удаляю существующий файл, я все еще не могу сохранить другой файл с тем же именем. Система по-прежнему считает, что файл существует, и, действительно, файл не удаляется в тот момент, когда программа выдает исключение, даже если две строки располагаются сразу друг за другом. Единственное, о чем я могу думать, это то, что операция "удаление" не успела завершиться к тому времени, когда операция перемещения хочет выполнить. Но я не знаю, как это исправить.

Код выглядит примерно так.

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

Я думал о настройке таймера для выполнения функции перемещения позже, но мне кажется, что это, вероятно, будет очень небрежным и опасным способом решения проблемы. Кроме того, время ожидания может варьироваться в зависимости от системы. Поэтому я думаю, что должен быть лучший путь.

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

И, к сожалению, оба семантически не эквивалентны. Индекс с одним int является начальным индексом. Итак, учитывая, что filePath равно test.txt файл, который вы хотите удалить .txt.bak и затем вы хотите переместить файл в test.bak, Или запустить это с эмулятором C# Mono:

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);

Наконец, не рекомендуется выполнять обработку пути самостоятельно: используйте специальные методы для объединения и манипулирования путями к файлам.

Я попробовал ваш код с небольшим изменением, и он работал нормально. Я изменил только то, как вы определили имя файла резервной копии, потому что расширение файла может быть больше или меньше 3 символов:

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

Но если это не сработает, попробуйте переименовать резервную копию, скажем, "*.bak2", а затем удалите ее.

Надеюсь, это поможет...

Другие вопросы по тегам