【发布时间】:2017-02-27 09:18:08
【问题描述】:
我的程序中有两个线程。 一个线程一直在观察 USB 事件(USB 插入或移除)。
第二个线程(文件复制线程)持续监控第一个线程设置的 USB 插入标志。插入 USB 后,文件复制线程开始将 Pdf 文件从 PC 复制到 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。此时,没有要“关闭”的文件流。
-
@MatthewWatson 是的,你可以,我不否认。我猜,弹性将来自容差。就我个人而言,我会做的是将文件完全装箱,或者回溯到您知道已写入的缓冲区 - 例如从您收到事件时起减去 2 秒。但是,这些都不是微不足道的或保证的 - 唯一的选择是将写入事件的任何文件合并,或者如果事件非常接近最后写入的文件 - 也考虑合并它。在复制结束时,可以进行哈希验证,并且可以删除任何失败的文件。
-
我认为一种可能性是检查要复制的文件的确切大小
->如果缓冲区的大小等于要复制的文件的大小,则将文件复制到缓冲区->复制然后复制文件…………有意义吗?
标签: c# multithreading