访问由单独的线程创建的文件

时间:2011-10-24 14:18:55

标签: c# multithreading io file-copying

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

我有一个服务,下载并解压缩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会保持结果文件锁定。什么时候所有工作同步,它的工作没有错误。 你有什么想法吗? THX。

2 个答案:

答案 0 :(得分:1)

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

当然,在从同步转移到异步时,您应该确保在副本仍在进行时不访问目标文件。

答案 1 :(得分:0)

使用流复制文件以避免从File.Copy

锁定窗口
using(var s = new MemoryStream(File.ReadAllBytes(filePath))
{
    using(var fs = new FileStream(newLocation, FileMode.Create))
    {
        s.WriteTo(fs);
    }
}