在原始文件保持锁定状态时,我需要有关如何锁定文件,复制文件,修改副本以及将副本保存回原始文件的帮助。
这是当前的流程: 用户打开文件,应用程序将其复制到临时文件夹并使用以下行锁定原始文件
_lockStream = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);
然后,当将临时文件保存回原始文件时,目前我正在使用以下例程(destination = _lockStream和source = temp file的流):
public static void Copy(Stream source, Stream destination, int bufferSize)
{
int readed = 0;
byte[] buffer = new byte[bufferSize];
destination.SetLength(source.Length);
destination.Position = 0;
while ((readed = source.Read(buffer, 0, buffer.Length)) > 0)
{
destination.Write(buffer, 0, readed);
}
destination.Flush();
}
我更喜欢使用File.Copy,但我不知道如何使用锁定文件,即使文件被应用程序锁定。 而且,更糟糕的是,我的方法不安全,如果应用程序或系统在中间崩溃,原始文件已损坏。我认为更正确的方法是复制到同一个文件夹,然后移动(或只是简单地移动)但我不知道如何保留锁定原始文件。
所以,现在为了安全起见我发布文件锁,并使用File.Copy,然后再次获取锁定。它可以工作,但是在几毫秒内文件被解锁并且可以被其他进程锁定。
做这些事情的最佳方式是什么?
答案 0 :(得分:0)
为了使您的方法安全,您可以像这样使用TransactionScope:
using(var scope = new TransactionScope())
{
Copy(source, destination, buffersize);
scope.Complete();
}