8

私のアプリケーション (C# 4.5 winforms アプリ) では、フォルダーの内容を定期的にチェックし、見つかったファイルの詳細をデータベースに保存します。このルーチン内で、 を使用してFileInfoインスタンスを作成し、プロパティ、、、およびnew FileInfo(path)を読み取ります。インスタンスでメソッドを呼び出すことはありません。CreationTimeLastWriteTimeLastAccessTimeLengthAttributesFileInfo

私が知りたいこと:FileInfoオブジェクトを作成している間にファイルが現在サードパーティのアプリケーションによって書き込まれている (または Windows によってフォルダーにコピーされている) 場合、破損、ロック、または実行時エラーのリスクはありますか?プロパティにアクセスしますか?

4

3 に答える 3

13

はい、これは「安全」です。これは、ファイル システム ドライバーという非常に低いレベルで処理されます。FAT や NTFS などの一般的なファイル システム上のファイルには、ディスク上に2 つの異なる構造があります。1 つ目はディレクトリ エントリで、ファイルに関するメタデータを格納します。名前、タイムスタンプ、属性、長さなど。実際のファイル データは別の場所 (ファイル データを格納するクラスターのチェーン) に格納されます。

FileInfo は、ファイルのメタデータのみを提供します。ファイル データはより機密性が高く、プロセスがファイルに書き込むときに変更される可能性が高くなります。特筆すべきは、FileShare オプションを使用してファイル データへのアクセスをロックできることです。しかし、メタデータをロックする方法はありません。したがって、別のプロセスがファイルで何をしているかに関係なく、いつでもファイルの FileInfo を取得できます。

もちろん、実際の FileInfo プロパティは、プロセスがファイルに書き込む間に変更される可能性があります。特に LastAccessTime プロパティは遅延更新されます。変更できない正確な情報を取得したい場合は、ファイルのロックを取得する必要があります。これを行うには、FileShare.Read または FileShare.None を使用してファイルを開きます。これにより、ファイルが開かれている限り、他のプロセスが書き込み用にファイルを開くことができなくなります。これは簡単に IOException をスローする可能性があることに注意してください他のプロセスがあなたの前に来ず、書き込みのためにファイルを開いたときにのみロックを取得します。

于 2013-01-06T13:20:57.790 に答える
1

いいえ、使用しているコンテキストにはありません。

FileSystemInfo.LastWriteから-> MSDN

注: このメソッドは、値がオペレーティング システムによって継続的に更新されない可能性があるネイティブ関数を使用するため、不正確な値を返す場合があります。

しかし、ちょっと想像してみてください。彼らは最新の値を返していました。値を (時間に応じて) 消費し、その後ファイルが上書きされると、最後にアクセスした値が間違ったり破損したりします。したがって、これは意味がありません。

于 2013-01-06T12:46:12.767 に答える
0

問題ありません msdn を参照してください:

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

スレッド セーフ この型の public static (Visual Basic では共有) メンバーはすべて、スレッド セーフです。インスタンス メンバーは、スレッド セーフであるとは限りません。

そして注意:

プロパティが最初に取得されると、FileInfo は Refresh メソッドを呼び出し、ファイルに関する情報をキャッシュします。それ以降の呼び出しでは、情報の最新のコピーを取得するために Refresh を呼び出す必要があります。

于 2013-01-06T12:47:02.160 に答える