9

C#を使用して巨大なテキストファイルを生成しようとしていますが、別のプロセスが常に場所を調べて、可能な場合はファイルを取得しようとしています。

以下のファイルをアトミックにするための手順は次のとおりです。

1 - Write to file : Filename_temp.txt
2 - Check if Filename.txt already exists then Delete
3 - Do a File.Move to the same destination     
    From filename : Filename_temp.txt 
    TO : Filename.txt

C#には名前の変更がないため、File.Moveに依存する必要があります。これにより、移動操作がアトミックになるようになりますか、それともこのアトミック性を実現する別の方法がありますか?

4

4 に答える 4

14

MSDNのブログ記事「ファイルにアトミック書き込みを行う方法」によると、NTFSファイルの名前変更はアトミック操作です。

ソリューション?メタデータの変更はアトミックであることを忘れないでください。名前の変更はそのような場合です。したがって、一時ファイルへの書き込みを実行するだけで、書き込みがディスク上にある(完了してフラッシュされた)ことがわかったら、古いファイルを新しいファイルと交換できます。

確かに、これはFile.MoveNTFSの名前変更操作を発行することを保証するものではありませんが、もっと複雑なことを行う必要がある正当な理由を考えることはできません。

于 2013-03-07T15:30:57.060 に答える
4

ソースと宛先が同じボリューム上にある場合、File.Moveは「名前の変更」である必要があります。したがって、ファイルサイズに関係なく、移動は「インスタント」である必要があります。それがあなたの懸念だと思いますか?

http://msdn.microsoft.com/en-gb/library/windows/desktop/aa365240%28v=vs.85%29.aspxのMS従業員からのFAQから。

'よくあ​​る質問:既存のファイルと新しいファイルの両方が同じドライブにある場合、MoveFileExはアトミックですか?

簡単な答えは、「通常、しかし、場合によっては、非アトミックな方法に静かにフォールバックするので、それを当てにしないでください」です。

それが100%重要であるなら、トランザクションNTFSを見ることができると思います。このためのラッパーが.Netにあるかどうかはまだわかりません。そのため、P/Invokeを使用する必要があるかもしれません。

于 2013-03-07T15:23:45.957 に答える
1

これは、c#や.Net Frameworkではなく、Windowsの機能です。

こちらをご覧ください

File.MoveのAtomicity

于 2013-03-07T15:29:35.033 に答える
0

ファイルを宛先に直接書き込み、巨大なファイルの準備ができた後に作成されるゼロサイズのシグナルファイルを使用できます。リーダープロセスは、シグナルファイルを探し、シグナルファイルが利用可能になった後で巨大なファイルを読み取ることができます。それで「原子性」の問題を解決できると思います。

于 2013-03-07T16:30:41.107 に答える