ファイルのフォルダとそのファイルの長さを追跡していますが、少なくとも1つのファイルに書き込みが行われています。現在のファイル長の取得/ FileInfo.Lengthのキャッシュと古い情報
私は他の目的のために使用する各ファイルの長さの連続的に更新された記録を保持する必要があります。
Update
メソッドは15秒ごとに呼び出され、ファイルの長さが前の更新で決定された長さと異なる場合、ファイルのプロパティを更新します。
更新方法は、次のようなものになります。
var directoryInfo = new DirectoryInfo(archiveFolder);
var archiveFiles = directoryInfo.GetFiles()
.OrderByDescending(f=>f.CreationTimeUtc);
foreach (FileInfo fi in archiveFiles)
{
//check if file existed in previous update already
var origFileProps = cachedFiles.GetFileByName(fi.FullName);
if (origFileProps != null && fi.Length == origFileProps.EndOffset)
{
//file length is unchanged
}
else
{
//Update the properties of this file
//set EndOffset of the file to current file length
}
}
私はDirectoryInfo.GetFiles()
であるという事実を認識していLength
含むFileInfo
性質の多くを事前移入を - と全くキャッシュが行われませんので、これは限りokですとの間の更新(キャッシュされた情報は15秒を超えてはなりません)。
私は、各DirectoryInfo.GetFiles()
呼び出しはすべてがFindFirstFile
/FindNextFile
のWin32 APIを使用して右クリック、新鮮な情報が移入されているFileInfos
の新しいセットを生成し、仮定の下にありました。しかし、これはそうではないようです。非常にまれ
が、最終的には確かに私はテストは、Windows 2008 Serverのx64の上で行われている(に書き込まなっているファイルのファイルの長さは、一度に5、10、あるいは20分に更新されていないような状況に遭遇それが問題なら)。
現在の回避策は、fi.Refresh()
を呼び出して、各ファイル情報を強制的に更新することです。これは内部的にファイル情報を更新するためにWin32 API呼び出しGetFileAttributesEx
に委任しているようです。
手動でリフレッシュを強制するコストは許容できますが、私はむしろ理解しています。なぜ私は古い情報を最初に取得しています。 FileInfo
の情報はいつ生成され、DirectoryInfo.GetFiles()
のコールにはどのような関係がありますか?私が完全に把握していないファイルI/Oキャッシュ層がありますか?
+1この場合、私は回避策がありますし、長期的にはFileSystemWatcherの使用をリファクタリングする可能性が最も高いですが、これはなぜ*私が古い情報を取得しているのかこの質問はすべてについてです – BrokenGlass
IMOいくつかのOSの現金化レイヤーが必要です。 stream.Flush()を呼び出しても、HDでの保存は強制されません。ディスク書き込みキャッシングを無効にしようとしましたか? http://support.microsoft.com/kb/259716 – Wojteq
他の説明が不足しているので、私は当面の対応策としてこの回答を受け入れます。 – BrokenGlass