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
。@AlexanderPetrovFileShare.Read
具有同样的效果