我跟蹤文件及其文件長度的文件夾,至少其中一個文件仍在寫入。獲取當前文件長度/ FileInfo.Length緩存和陳舊信息
我必須保持每個文件長度不斷更新的記錄,我用於其他目的。
如果文件長度與上一次更新中確定的長度不同,則每15秒調用一次Update
方法並更新文件的屬性。
update方法看起來是這樣的:
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()
預填充許多FileInfo
屬性,包括Length
的 - 並且沒有緩存做這行,只要之間更新(緩存的信息不應該超過15秒)。
我是每個DirectoryInfo.GetFiles()
調用生成一個新一套的FileInfos
所有被填充新鮮信息的權利,然後使用FindFirstFile
/FindNextFile
的Win32 API的假設下。但似乎並非如此。
很少,但最終肯定會遇到這樣的情況:正在寫入的文件的文件長度一次不會更新5,10或20分鐘(測試在Windows 2008 Server x64上完成如果那件事)。
當前的解決方法是調用fi.Refresh()
來強制更新每個文件信息。這似乎在內部似乎委託到一個GetFileAttributesEx
Win32 API調用來更新文件信息。
雖然手動強制刷新的成本是可以忍受的,但我寧願明白爲什麼我得到的是過時的信息。 FileInfo
信息何時生成以及它與DirectoryInfo.GetFiles()
的呼叫有什麼關係?底下有一個文件I/O緩存層,我沒有完全掌握?
+1一個合理的建議 - 在這一點上我有一個解決方法,並從長遠來看最有可能將重構使用FileSystemWatcher - 但這並不回答*爲什麼*我得到陳舊的信息,這是什麼這個問題全部關於 – BrokenGlass
IMO必須由一些操作系統兌現層。即使你調用stream.Flush()它也不會強制保存HD。您是否嘗試禁用磁盤寫入緩存? http://support.microsoft.com/kb/259716 – Wojteq
由於缺乏任何其他解釋,我將暫時接受此答案作爲解決方法。 – BrokenGlass