c#copy / move into locked file / stream

时间:2012-10-05 08:30:57

标签: c# file stream locking

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

using(var scope = new TransactionScope())
{               
    Copy(source, destination, buffersize);
    scope.Complete();
}