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 に答える