【问题标题】:How to copy a file with the ability to cancel the copy?如何复制具有取消复制功能的文件?
【发布时间】:2011-12-02 14:21:12
【问题描述】:

我正在尝试让 程序 能够取消复制。因此我不能使用Microsoft.VisualBasic.FileIO.FileSystem.CopyFile

网络上有一些CopyFileEx 的包装器,例如here。但是,我宁愿不使用我不理解的东西,也不想要任何意想不到的结果(或错误)。有没有管理的方法来做到这一点?或者也许是 MS 的包装器(在 Windows API CodePack 中)?

【问题讨论】:

  • 不管你怎么做,你可能想要复制到一个临时文件,然后在复制完成后将临时文件移动到正确的位置。这样,当副本被取消时,您就不会丢弃(可能存在的)目标文件。
  • 正确复制文件非常困难。使用 Toub 的代码。

标签: c# multithreading io


【解决方案1】:

以小块的形式读取文件并将其写入目标。定期检查您是否被要求取消,如果检测到,请停止写入并关闭文件。

【讨论】:

  • 参见 Coderer 的回答中的 here,例如,我的代码不会利用 DMA。
【解决方案2】:

您是否尝试过以块的形式复制流,并且每次检查块时检查是否设置了取消或注册了取消令牌?

例如,您可以执行以下操作:

void CopyStream(Stream inputStream, Stream outputStream)
{
    var buffer = new byte[1024];

    int bytesRead;
    while((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
    {
        outputStream.Write(buffer, 0, bytesRead);
        if(cancelled){
           // cleanup

           return;
        }
    }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2021-09-16
  • 2019-03-04
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
相关资源
最近更新 更多