我想通过覆盖将文件从一个目录复制到另一个目录。为了保持一致性,我想在复制之前锁定所有目标文件,覆盖它们,然后解锁。
This question建议使用FileStream
进行锁定。但是,FileStream.Lock()
或FileShare.None
同时锁定此进程中的文件,使File.Copy()
抛出IOException
。
这是一个MVCE:
using System.Collections.Generic;
using System.IO;
namespace Test1
{
public class Program
{
public static void Main(string[] args)
{
var oldDir = @"c:\old\";
var newDir = @"c:\new\";
var locks = new List<FileStream>();
foreach (var item in Directory.EnumerateFiles(newDir))
{
var newLock = new FileStream(item, FileMode.Open, FileAccess.Read, FileShare.None);
locks.Add(newLock);
}
foreach (var item in Directory.EnumerateFiles(oldDir))
{
var dest = Path.Combine(newDir, Path.GetFileName(item));
File.Copy(item, dest, true);
}
}
}
}
使用相同的FileStream
复制唯一方式,还是可以使用File.Copy()
?怎么样?