C# 调用file.Copy()之前可以锁定文件吗

C# 调用file.Copy()之前可以锁定文件吗,c#,C#,我想通过覆盖将文件从一个目录复制到另一个目录。为了保持一致性,我希望在复制之前锁定所有目标文件,覆盖它们,然后解锁 建议使用FileStream进行锁定。但是,FileStream.Lock()或FileShare.None也会锁定此进程中的文件,使File.Copy()引发IOException 这里有一个MVCE: using System.Collections.Generic; using System.IO; namespace Test1 { public class Pr

我想通过覆盖将文件从一个目录复制到另一个目录。为了保持一致性,我希望在复制之前锁定所有目标文件,覆盖它们,然后解锁

建议使用
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);
            }
        }
    }
}
使用System.Collections.Generic;
使用System.IO;
名称空间Test1
{
公共课程
{
公共静态void Main(字符串[]args)
{
var oldDir=@“c:\old\”;
var newDir=@“c:\new\”;
var locks=新列表();
foreach(Directory.EnumerateFiles(newDir)中的var项)
{
var newLock=newfilestream(项,FileMode.Open,FileAccess.Read,FileShare.None);
locks.Add(newLock);
}
foreach(Directory.EnumerateFiles(oldDir)中的var项)
{
var dest=Path.Combine(newDir,Path.GetFileName(item));
文件副本(项目、目的地、真实);
}
}
}
}

使用相同的
FileStream
进行复制是唯一的方法,还是我仍然可以使用
File.Copy()
?怎么做?

既然你已经有了一个文件流,你可以自己用文件流而不是文件.copy来编写副本。@Vijay,我刚才说的-“使用相同的文件流进行复制是唯一的方法”改用
FileShare.Read
。@AlexanderPetrov
FileShare.Read
具有同样的效果