Как отслеживать изменения текстовых файлов с помощью C ++? Сложность: Нет .NET

Пример использования: стороннее приложение хочет программно отслеживать текстовый файл, созданный другой программой. Текстовый файл содержит данные, которые вы хотите анализировать по мере его обновления.

Я нахожу множество ответов на этот вопрос, связанных с FileSystemWatcher, но допустим, вы пишете приложение для компьютера с Windows и не можете гарантировать, что .NET установлен.

Доступны ли для этого какие-либо библиотеки, или мне просто нужно будет развернуть собственное решение?

Спасибо.


person scubabbl    schedule 23.10.2008    source источник


Ответы (4)


Вы можете отслеживать каталог с помощью FindFirstChangeNotification, работающего в любых окнах.
Это эффективно, если вы знаете, где находится файл - в противном случае вы можете использовать виртуальный драйвер / Filemon, описанный ниже, для проверки изменений в любом месте системы.

Пример кода здесь

person Martin Beckett    schedule 23.10.2008

Более простым решением может быть проверка последней измененной отметки времени файла.

Если вы используете для этого функцию _stat64 (), она становится кроссплатформенным решением.

Пример кода:

struct __stat64 fileinfo;

if(-1 != _stat64(filename, &fileinfo)
   return fileinfo.st_mtime;
person Adam Pierce    schedule 23.10.2008
comment
Стоит отметить, что FindFirstChangeNotification не работает с отдельными файлами. - person Gearoid Murphy; 17.09.2010

выглядит так: Отслеживание того, какой процесс открыл конкретный файл

снова sysinternal дал несколько советов и инструменты

person call me Steve    schedule 23.10.2008

Это очень похоже на то, что делает FileMon от sysinternals (теперь MS). Они делают это, создавая драйвер виртуального устройства, который динамически загружается. у них есть хорошее описание того, как это работает здесь:

Как работает FileMon

Для драйвера Windows 9x в основе FileMon лежит драйвер виртуального устройства Filevxd.vxd. Он динамически загружается и при инициализации устанавливает фильтр файловой системы через службу VxD, IFSMGR_InstallFileSystemApiHook, чтобы вставить себя в цепочку вызовов всех запросов файловой системы. В Windows NT ядром FileMon является драйвер файловой системы, который создает и прикрепляет объекты фильтрующих устройств к объектам устройств целевой файловой системы, чтобы FileMon мог видеть все IRP и запросы FastIO, направленные на диски. Когда FileMon видит вызов open, create или close, он обновляет внутреннюю хеш-таблицу, которая служит в качестве сопоставления между внутренними дескрипторами файлов и именами путей к файлам. Всякий раз, когда он видит вызовы, основанные на дескрипторах, он ищет дескриптор в хэш-таблице, чтобы получить полное имя для отображения. Если доступ на основе дескриптора ссылается на файл, открытый до запуска FileMon, FileMon не сможет найти отображение в своей хэш-таблице и вместо этого просто представит значение дескриптора.

person Joe Basirico    schedule 23.10.2008