2011-10-24 30 views
-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保持锁定结果文件。什么时候同步工作,它的工作没有错误。 你有什么想法吗? Thx。

回答

1

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

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

+0

首先我打电话File.Copy(synchronuously),然后我开始新的主题。原因File.Copy同步调用,它确保在新线程启动之前完成其工作。或者我错了某处? – Skog

+0

+1 - 只是为了澄清最后一部分:当文件被复制时,Windows对文件进行独占锁定。 – ebb

0

复制与流的文件,以避免窗锁从File.Copy

using(var s = new MemoryStream(File.ReadAllBytes(filePath)) 
{ 
    using(var fs = new FileStream(newLocation, FileMode.Create)) 
    { 
     s.WriteTo(fs); 
    } 
} 
+1

正确复制文件是火箭科学。需要注意保留文件中的文件属性和备用流。不要自己动手。 –