2

我发现 File.Copy 很乐意将文件复制到自身而不会引发异常。错误地,我将一个 sqlite 数据库文件复制到自身上,并且该文件不再是有效的数据库。我已经多次重复这个作为测试并得到相同的结果。使用 winmerge(或文本编辑器)我看到结果文件有 0 个字节,但 Windows 资源管理器仍然显示原始文件大小。我在这里错过了什么?(vs2008, win7-64)

编辑:一些代码。我知道很简单。而且不是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;
    }

编辑#2:问题是特定于 System.Data.SQLite、文件上打开的 SQLiteConnection 以及与 File.Copy 的交互。我希望文件复制失败并出现异常,但它只是默默地消除了整个文件。

4

1 回答 1

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"));
}
于 2010-11-09T09:03:08.640 回答