-1

复制和访问文件时,我遇到了多线程问题。

我有一项服务,它下载并解压缩 Zip 存档,然后将文件从解压缩文件夹复制到正确的位置:

//Download, and uzip archive...

//Copy a needed file to its right location
File.Copy(fileName, fileDestination);

然后我启动一个单独的线程,它需要访问复制的文件:

TheadPool.QueueUserWorkItem(s => processCopiedFile(fileDestination));

这是来自 ProcessCopiedFile 的代码片段:

private void ProcessCopiedFile(string filePath)
{
    ...
    //Load the file, previously copied here
    var xml = XDocument.Load(filePath);
    ...
    //Do other work...
}

XDoument.Load 调用失败并出现异常:

The process cannot access the file <FileName> because it is used by another process.

似乎 File.Copy 保持结果文件锁定。当所有工作同步进行时,它可以正常工作。你有什么想法吗?谢谢。

4

2 回答 2

1

File.Copy 不会保持任何打开或锁定,它是一个需要一些时间的原子操作,当然取决于磁盘/网络 I/O 和文件大小。

当然,在从同步移动到异步时,您应该确保在复制仍在进行时不要访问目标文件。

于 2011-10-24T14:22:58.387 回答
0

使用流复制文件以避免来自 File.Copy 的 Windows 锁定

using(var s = new MemoryStream(File.ReadAllBytes(filePath))
{
    using(var fs = new FileStream(newLocation, FileMode.Create))
    {
        s.WriteTo(fs);
    }
}
于 2011-10-24T15:55:10.577 回答