Удаленный файл все еще существует?
Я пытаюсь сохранить резервную копию некоторых данных. Если резервная копия существует, я хочу удалить ее, дать самому последнему файлу имя файла резервной копии, а затем сохранить новый файл как самый последний файл.
Проблема, с которой я сталкиваюсь, состоит в том, что, когда я удаляю существующий файл, я все еще не могу сохранить другой файл с тем же именем. Система по-прежнему считает, что файл существует, и, действительно, файл не удаляется в тот момент, когда программа выдает исключение, даже если две строки располагаются сразу друг за другом. Единственное, о чем я могу думать, это то, что операция "удаление" не успела завершиться к тому времени, когда операция перемещения хочет выполнить. Но я не знаю, как это исправить.
Код выглядит примерно так.
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", а затем удалите ее.
Надеюсь, это поможет...