2010-11-09 3 views
2

Я нахожу, что File.Copy с удовольствием скопирует файл на себя, не выбрасывая исключение. По ошибке я скопировал файл базы данных sqlite на себя, и этот файл больше не является допустимой базой данных. Я повторил это как тест несколько раз и получил тот же результат. Используя winmerge (или текстовый редактор), я вижу, что файл результатов имеет 0 байт, но в проводнике Windows по-прежнему отображается исходный размер файла. Что я пропустил здесь? (vs2008, win7-64)System.Data.SQLite и странные ошибки File.Copy

Редактировать: код. Довольно упрощенно я знаю. И это не 0 байт, это все nuls.

 public bool RestoreDatabaseSqlite(string backupFilePath) 
    { 
     try 
     { 
      File.Copy(backupFilePath, _databaseFilePath, true); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show("Error restoring database file: " + ex.Message, "Database Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      return false; 
     } 

     return true; 
    } 

Edit # 2: Проблема специфична для System.Data.SQLite, открытой SQLiteConnection на файл, и взаимодействие с File.Copy. Я ожидал бы, что копия файла завершится с ошибкой, но она просто отключит весь файл.

+0

Проверили ли вы с двоичным безопасным редактором (например, шестнадцатеричный редактором), или только простыми текстовыми редакторами? – CodesInChaos

+0

Извините, но вы ошибаетесь. Просто попробовал сам с методом File.Copy, и вы получите «Процесс не может получить доступ к файлу ... потому что он используется другим процессом». Пожалуйста, разместите свой код, так как он * не * с помощью File.Copy –

+0

Использование wnbrowse выглядит так, как будто это все nuls. –

ответ

3

Быстрый тест:

File.Copy("foo.htm", "foo.htm"); 

бросает IOException:

Файл 'foo.htm' уже существует.

Попытка с перезаписью:

File.Copy("foo.htm", "foo.htm", true); 

бросает IOException:

Процесс не может получить доступ к файлу 'foo.htm', так как он используется другим процессом.

Как правило, он выглядит покрытым. Вы делаете что-то конкретно?


Я добавил некоторую дополнительную двойную проверку, и она по-прежнему кажется, хорошо:

Console.WriteLine("Before:"); 
Console.Write(File.ReadAllText("foo.htm")); 
Console.WriteLine(); 
Console.WriteLine("After:"); 
try 
{ 
    File.Copy("foo.htm", "foo.htm", true); 
} 
catch (IOException) { 
    Console.Write(File.ReadAllText("foo.htm")); 
} 
+0

Я полностью согласен с вашим ответом, и это то, чего я ожидал бы. Файл уничтожен, однако, заменен на все nuls. Я добавил код к моему вопросу. Я буду пытаться найти, что такое моя ошибка ... Мой клиент нашел эту ошибку сегодня, и я воспроизвел ее. –

+0

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

+0

Если я делаю тот же тест, что и в своем предыдущем комментарии, но поставил File.Copy в контексте открытого соединения sqlite в файле (это то, что я знаю неправильно), я могу воспроизвести эту ошибку. –