我的程序中有两个线程。 单线程是继续观察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。那时,没有文件流可以“关闭”。 –