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