2009-04-21 7 views
19

ディレクトリ内のファイルの名前をアトミックトランザクションとして変更したいとします。ファイルはディレクトリを変更しません。パスはNTFSファイルシステムへのUNCパスとして提供されます。おそらくサーバー03または08のいずれかにあります。Atomicity of File.Move

これらの目的でFile.Move()はアトミックですか?のように、それは正常に完了するか、元のファイルが元のままであるように失敗しますか?

私の腸ははいですが、私は確信していました。

+0

脇に、SVNは、更新/コミット中に完全性を維持するために、(ほとんどのファイルシステム上の)アトミック操作であるという事実を利用しています。 – rmeador

+0

は、「アトミック」は複数の操作があることを暗示していませんか?この特定の名前を変更する操作は複数回になるとどうなりますか?コピー+削除ではありません。 – Lucas

+1

@Lucas:atomicは、内部的にいくつのステップがあるかにかかわらず、操作は常に一緒に起こることを意味します。これは、別の糸などによって部分的に先取りされることはできません。これは、現代物理学による実際の原子の場合には意味が不自然である「原子」という言葉の元の「不可分」の意味です。 – rmeador

答えて

21

はい、NTFSです。 here

NTFSで実行している場合は、ファイル操作はファイルシステムレベルでアトミックです。より高いコードに関しては、一度の操作で名前の変更が行われます。あなたが見ている問題は、FileInfoオブジェクトがアプリケーション間で共有されている場合に問題になるようです。 MarshalByRefオブジェクトであるため、リモート環境で使用できます。これがあなたに当てはまるかどうかわかりません。

+0

ですが、.netアプリケーションがFAT上で動作している場合や、ファイル共有上の何かにアクセスしている場合はどうなりますか? APIの一部として名前変更がアトミックに行われるか、またはアトミック性が達成できないことを示す例外がスローされるかを保証する 'File.Rename()'はどこにありますか? – binki

+1

ああ、明らかに私は、Windows 98やFAT(または原子性を保証できない状況、または少なくともそれが[docs](https:// msdn)のものである場合、例外をスローする 'File.Replace()'を望みます。 microsoft.com/en-us/library/9d9h163f%28v=vs.110%29.aspx)が示唆しているようです)。 – binki