【问题标题】:c# copy/move into locked file/streamc#复制/移动到锁定的文件/流
【发布时间】:2012-10-05 08:30:57
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# file stream locking


    【解决方案1】:

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

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

    【讨论】:

    • 这不起作用。当我在调试器中停止复制方法并退出时,目标流被部分覆盖。
    猜你喜欢
    • 2012-04-24
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多