2014-01-10 3 views
2

Возможно ли, что определенный код выполняется при открытии файла определенного типа? В моем случае я хочу «слушать», когда открываются видеофайлы («.avi, mp4 и т. Д.») (Либо через оболочку проводника файлов Windows, либо, возможно, непосредственно из видеопроигрывателя?), Чтобы я мог хранить историю воспроизведенных видеороликов.windows api - обнаружение при открытии файла определенного типа

Стоимость часа в googling не показала ничего, поэтому я обращаюсь к вам с помощью stackoverflow. Пожалуйста, укажите мне в правильном направлении.

Спасибо.

+0

И если я открою видеофайл в шестнадцатеричном редакторе, вы также добавите в историю видео PLAYED ??? – user2120666

+0

@ user2120666 Да, это было бы приемлемо для моего варианта использования. – Rafe

+0

Итак, зацепите CreateFile и/или ShellExecute. – user2120666

ответ

1

Я бы не зацепил CreateFile для этой работы. У Windows есть механизмы, встроенные для обработки заданий, таких как это намного более чисто.

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

Хотя это довольно редко, что может «пропустить» изменения при редких обстоятельствах . Если вы должны иметь 100% -ную точность (вместо, скажем, 99,9%), вы можете вместо этого читать change journals, но это отличная сумма дополнительной работы за то преимущество, которое вам может не понравиться.


1. Существует одно обстоятельство, которое не является (обязательно) редко, что вы могли бы заботиться о том, хотя: ReadDirectoryChangesW будет работать только тогда, когда/если программа запущена. Журнал изменений позволит вам узнать о событиях, которые произошли, даже если ваш код не работает вообще.

+2

Это вряд ли будет работать с современными (Post Windows XP) аксессуарами для окон, поскольку по умолчанию из-за ограничений по умолчанию отключены временные метки последнего доступа. – Bukes

+0

Я также добавлю, что журналы изменений NTFS, очевидно, специфичны для NTFS и не помогут, если OP хочет отслеживать такие открытия для файлов, которые находятся на томах, отличных от NTFS. – Bukes

+0

Если включено, метка последнего доступа обновляется, когда соответствующий файл HANDLE ** закрыт **. Вы не будете получать уведомления при открытии файла. – IInspectable

4

Лучший (и единственный разумный способ) для захвата событий файловой системы (открыть/чтение/запись) из произвольных процессов, написав File System MiniFilter

Если вы разрабатываете коммерческий продукт, пожалуйста, воздержитесь от «привязать» API-интерфейсы Usermode, такие как CreateFile. Для этого требуются многочисленные хакеры с платформой, а также кошмар совместимости.

Смежные вопросы