File.Copy()在多线程C#程序中复制损坏的文件

时间:2017-02-27 09:18:09

标签: c# multithreading

我的程序中有两个线程。 一个帖子 会持续观察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;
    }

1 个答案:

答案 0 :(得分:1)

这是预期的结果

如果我理解了您的问题,那么您正在写入存储介质,并在执行此操作时将其删除。这就像要求数据被破坏一样。

编辑:

这显然是由不知道如何操作电脑的用户引起的,虽然它会发生,但我不会浪费太多时间。我会以另一种方式解决这个问题,而不是试图恢复损坏的数据。

  1. 向用户提供有关正在发生的事情的明确消息,以便他们可以识别正在进行的复制操作,并且现在移除USB驱动器将导致问题。
  2. 通知用户操作已结束,并且可以安全地移除USB驱动器。
  3. 您将能够检测在复制过程运行时是否移除了USB驱动器,通知用户有关它,并要求他们重新插入。
  4. 如果发生第3步,请检查您是否能够覆盖,您永远不会知道。如果它不起作用,请稍后使用后缀更改文件名,并将该文件名写入USB驱动器。这样,即使他搞砸了,用户也可以获得他所需要的东西。
  5. 如果文件名很重要,并且后缀不是一个选项,您甚至可以尝试使用通用UUID作为文件名编写文件,并在进程成功完成后将文件重命名为source-filename,这样任何损坏文件不会成为问题,在这些情况下不需要后缀。
  6. 如果存在这种可能性,您可能需要检查在这种情况下是否可以选择格式化驱动器。它可能会解决您的问题,并且可能对用户来说是一个小问题。