2010-11-09 54 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