System.Data.SQLite и странные ошибки File.Copy - PullRequest
2 голосов
/ 09 ноября 2010

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

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

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

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

1 Ответ

3 голосов
/ 09 ноября 2010

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

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"));
}
...