复制和访问文件时,我遇到了多线程问题。
我有一个服务,下载并解压缩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。
答案 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);
}
}