Я отслеживаю папку с файлами и их длину, по крайней мере, один из этих файлов все еще записывается.
Я должен постоянно обновлять записи о длине каждого файла, который я используюдля других целей.
Метод 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()
предварительно заполняет многие из FileInfo
свойств, включая Length
- и это нормально, покапоскольку кэширование не выполняется между обновлениями (кэшированная информация не должна быть старше 15 секунд).
Я предполагал, что каждый вызов DirectoryInfo.GetFiles()
генерирует new набор FileInfos
, которые все заполняются свежей информацией прямо тогда с использованием FindFirstFile
/ FindNextFile
Win32 API.Но, похоже, это не так.
Очень редко, но, в конце концов, я наверняка столкнусь с ситуациями, когда длина файла для записываемого файла не обновляется в течение 5, 10 или даже 20 минут.за раз (тестирование выполняется на Windows 2008 Server x64, если это имеет значение).
Текущий обходной путь - вызвать fi.Refresh()
, чтобы принудительно обновить информацию о каждом файле.Кажется, это внутренне делегирует вызов GetFileAttributesEx
Win32 API для обновления информации о файле.
Хотя стоимость принудительного обновления вручную терпима, я бы лучше понял почему Я получаю устаревшиеинформация в первую очередь.Когда генерируется информация FileInfo
и как она связана с вызовом DirectoryInfo.GetFiles()
?Есть ли слой кэширования файлового ввода-вывода, который я не до конца понимаю?