Как я могу отслеживать изменения текстовых файлов с помощью C ++? Сложность: нет .NET - PullRequest
4 голосов
/ 24 октября 2008

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

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

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

Спасибо.

Ответы [ 4 ]

8 голосов
/ 24 октября 2008

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

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

5 голосов
/ 24 октября 2008

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

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

Пример кода:

struct __stat64 fileinfo;

if(-1 != _stat64(filename, &fileinfo)
   return fileinfo.st_mtime;
1 голос
/ 24 октября 2008

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

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

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

1 голос
/ 24 октября 2008

выглядит следующим образом: Отслеживание процесса, который открыл определенный файл

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

...