0

我需要有关如何锁定文件、复制文件、修改副本以及将副本保存回原始文件的帮助,而原始文件仍处于锁定状态。

这是当前流程:用户打开文件,应用程序将其复制到临时文件夹中并使用以下行锁定原始文件

_lockStream = new FileStream(Path, FileMode.Open, FileAccess.ReadWrite, FileShare.Read);

然后在将临时文件保存回原始文件时,目前我正在使用以下例程(目标 = _lockStream,源 = 临时文件的流):

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,然后再次获取锁。它可以工作,但是文件在几毫秒内被解锁并且可以被其他进程锁定。

做这些事情的最佳方法是什么?

4

1 回答 1

0

为了使您的方法安全,您可以像这样使用 TransactionScope:

using(var scope = new TransactionScope())
{               
    Copy(source, destination, buffersize);
    scope.Complete();
}
于 2012-10-05T08:37:33.957 回答