我的程序中有兩個線程。 單線程是繼續觀察USB事件(USB insterted或Removed)。File.Copy()複製多線程C#程序中的損壞文件
第二個線程(文件複製線程)隨時監控第一個線程設置一個USB插入標記。一旦插入USB,文件複製線程就開始將PC上的PDF文件複製到USB。
一旦USB被移除,USB監視線程將isUSBInsterted
標誌設置爲False
,並且文件複製線程應該停止文件傳輸。
問題:只有當文件複製線程已經傳輸一個PDF文件,但USB已經彈出時,問題纔出現。在這種情況下,在USB創建一個損壞的PDF文件,並以後即使我嘗試刪除該文件,文件將再次出現(與像無法覆蓋等其它問題)
問題:我怎麼能確保File.Copy()
不會在USB中創建損壞的文件。我認爲即使該程序不是多線程的,也會出現問題,因爲這與開始將文件複製到USB以及在複製過程正在進行時USB被彈出有關。
我複製代碼:
private bool CopyFile(string FilenameToBeCopied, string SrcDirectory, string DstDirectory)
{
bool CopiedSuccessfully = false;
try
{
Directory.CreateDirectory(DstDirectory); //This will create a directory if it does not exist yet.
File.Copy(SrcDirectory + "/" + FilenameToBeCopied, DstDirectory + "/" + FilenameToBeCopied, true);
Console.WriteLine("Copied: " + FilenameToBeCopied);
CopiedSuccessfully = true;
}
catch (IOException copyError)
{
Console.WriteLine(copyError.Message);
}
return CopiedSuccessfully;
}
我不認爲你可以做任何事情。您不應當在寫入存儲設備時刪除存儲設備,因爲它可能導致損壞的文件(如您發現的那樣)。 –
'File.Copy'在這種情況下不會爲您提供任何恢復能力。您可能不得不求助於打開文件流並儘可能在緩衝區間進行復制,並且當您收到未插入設備的事件時,請記住文件流中的位置並將其關閉。這會留下部分文件,但可以在設備重新插入時恢復。 –
@AdamHouldsworth即使您一次寫入單個緩衝區,但如果在中途彈出設備,最終可能會損壞文件。當然,如果你彈出設備,對Stream.Write()的調用可能會拋出IOException。那時,沒有文件流可以「關閉」。 –