2010-11-09 52 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; 
    } 

编辑#2:问题是特定于System.Data.SQLite,开放SQLiteConnection上的文件,并与File.Copy的相互作用。我期望文件副本失败并出现异常,但它只是默默地提醒整个文件。

+0

你用二进制安全的编辑器(例如十六进制编辑器),或者只是简单的文本编辑器检查? – CodesInChaos 2010-11-09 08:56:53

+0

对不起,但你错了。用File.Copy方法自己试了一下,得到“进程无法访问该文件...因为它正在被另一个进程使用”。请发布您的代码,因为它*不*使用File.Copy – 2010-11-09 09:02:51

+0

使用wnbrowse它看起来像它的所有nuls。 – 2010-11-09 09:05:03

回答

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。我将代码添加到了我的问题中。我会继续试图找出我的错误。我的客户今天发现了这个错误,我转载了它。 – 2010-11-09 09:10:49

+0

我刚刚介绍了调试器中的代码,验证了文件路径是相同的,并且没有抛出异常,并且文件被清除。我写了一个简短的控制台应用程序作为实际检查来测试File。复制,它确实会抛出异常,如你所说。 – 2010-11-09 09:31:13

+0

如果我执行与我以前的评论相同的测试,但将File.Copy放在文件上打开的sqlite连接的上下文中(这是我知道的错误),我可以重现此错误。 – 2010-11-09 17:49:41