Как следить за изменениями файлов и папок в Windows. Отслеживание изменения файлов и папок в Windows Как работает программа мониторинга доступа

Операционная система Windows оснащена инструментом Проводник, который позволяет получить представление о том, что находится на дисках. Помимо списка файлов мы видим также информацию об их размере и дате создания или изменения. Это, однако, слишком мало информации, чтобы найти те данные, которые наиболее засоряют диск.

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

WinDirStat

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

Преимущества WinDirStat

  • Доступная форма графической визуализации
  • Также работает в старых версиях Windows
  • Можно определить способ отображения элементов
  • Карты дерева

Недостатки:

  • Отсутствие возможности определения окраски большего числа типов файлов

Тип распространения : freeware
Цена : бесплатно

SpaceSniffer Portable

SpaceSniffer сканирует и показывает Вам содержимое выбранных дисков в удобном для чтения виде иерархической цветной схеме.

Преимущества SpaceSniffer

  • Не требует установки
  • Широкие возможности фильтрации данных, которые визуализируются

Тип распространения : freeware
Цена : бесплатно

TreeSize Free

Приложение TreeSize Free позволяет быстро просканировать содержимое любого носителя, а результаты отображаются в виде раскрывающегося дерева.

Преимущества TreeSize Free

  • Удобная сортировка по размеру, количеству файлов или папок
  • Справляется с альтернативными потоками данных файловой системы NTFS
  • Интерфейс адаптированный для сенсорных экранов

Недостатки:

  • Только в англоязычной версии

Тип распространения : freeware
Цена : бесплатно

JDiskReport

JDiskReport - для любителей статистики в виде диаграмм, напоминающих диаграммы из Excel. Вместо деревьев у нас тут гистограммы и круговые диаграммы.

Преимущества JDiskReport

  • Интересные графические схемы
  • Много различных статистических данных, в том числе разделение по размерам и дате создания
  • Доступна Java версия, которая работает на любой платформе с Java

Недостатки:

  • Версия для Windows требует установленной Java

Тип распространения : freeware
Цена : бесплатно

FolderSize

FolderSize выделяется окном сводки. Оно отображает диаграммы и список файлов или папок, которые можно сортировать по различным критериям.

Преимущества FolderSize

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

Недостатки:

  • Бесплатная версия не позволяет сканировать сопоставленные жесткие диски и сетевые

Тип распространения : freeware
Цена : бесплатно

Я бы хотел посвятить статью обзору API, предоставляемых разными ОС для слежения за изменениями в директории. Статья появилась как результат моей работы над демонами слежения за изменениями для утилиты dklab_realsync ( , github репозиторий) и своей собственной, которую я пока что не хочу анонсировать.

Windows, ReadDirectoryChangesW

Для операционной системы Windows есть замечательная функция ReadDirectoryChangesW , которая возвращает набор изменений для директории, в том числе содержит флаг для работы рекурсивно (bWatchSubtree). Таким образом, реализация слежения за изменениями в директории не представляет особого труда и в том же dklab_realsync реализация занимает 80 строк кода или 3.5 Кб. Интересно, что в Windows эти события поддерживаются даже через SMB!

Тем не менее, существуют определенные подводные камни:

  • конечный размер буфера изменений, после которого очередь событий переполнится и эти события будут потеряны
  • согласно документации к watchdog package , событие перемещения посылается раньше, чем изменения становятся видны в ФС
  • размер буфера ограничен в 64 Кб для сетевой ФС

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

Mac OS X, FSEvents

В Mac OS X также есть удобный и простой API для слежения за изменениями в файловой системе под названием FSEvents . С использованием этого API простейшая реализация демона составляет 50 строк кода или 1.8 кб. Очередь не может переполниться (!), но полное сканирование все же может потребоваться, если демон fseventsd «упадет». Стоит отметить, что этот API до версии 10.7 не предоставляет изменения по файлам, он сообщает только директории, в которых что-то изменилось. Поскольку события никуда не деваются и пишутся в лог (FSEvents service stores events in a persistent, per-volume database), детализация с точностью для директории позволяет сэкономить место на диске.

Вывод: FSEvents API для Mac OS X является самым необычным из всех подобных API. Очередь не переполняется и даже имеется возможность получить события из прошлого. Тем не менее, детализация событий дается с точностью до директории (до версии 10.7), что означает меньшую эффективность демона для синхронизации файлов.

Linux, inotify

В linux vanilla kernel существует один способ слежения за изменениями в директории - это inotify . Для этого API существует хорошая и подробная документация, но нет поддержки рекурсивного слежения за изменениями! Также, у inotify есть ограничение на максимальное количество объектов, за которыми можно следить. Простейшая реализация демона занимает уже 250 строк кода или 8 кб. Статическая сборка с использованием dietlibc занимает примерно 14 кб. Другим неприятным моментом является то, что приложение должно само поддерживать соответствия между watch descriptor (в нашем случае это всегда директория) и именем. Есть функция inotify_add_watch , которой передается путь до отслеживаемой директории, но нет обратной - inotify_get_path, которая бы возвращала этот самый путь по переданному дескриптору. События же содержат только watch descriptor и относительный путь до изменившегося файла внутри директории.

Подводные камни рекурсивного слежения за директорией через inotify:

  • Возможность переполнения очереди (длина очереди задается в /proc/sys/fs/inotify/max_queued_events)
  • Ограничение на максимальное количество объектов слежения (задается в /proc/sys/fs/inotify/max_user_watches)
  • Отсутствие возможности рекурсивного слежения за директорией
  • Необходимость отдельно обрабатывать случай, когда создается директория (например mkdir -p a/b/c). Вы получите событие о том, что создана директория «a», но пока вы навешиваете обработчик на эту директорию, в ней уже могут создать ещё одну директорию и событие об этом вам уже не придет.
  • Теоретическая возможность целочисленного переполнения watch descriptor (wd), так как он задается uint32

FreeBSD, Mac OS X, kqueue

FreeBSD и Mac OS X позволяют отслеживать за изменениями с помощью kqueue, который аналогичен inotify по своим характеристикам и также не имеет возможности рекурсивного слежения за директориями. Также, kqueue принимает в качестве аргументов дескрипторы открытых файлов (директорий), поэтому при использовании этого API ограничения на количество отслеживаемых директорий ещё более строгие.

Итого:

Как можно видеть, у всех API существуют свои достоинства и недостатки. Наименее удобными являются механизмы kqueue и inotify, но они же являются самыми эффективными и надежными. Коммерческие ОС предоставляют более удобные механизмы слежения за изменениями, но у них тоже есть свои особенности. Надеюсь, теперь вы имеете больше представления о том, как тяжела участь Dropbox и подобных программ, которым требуется со всем этим уживаться и осуществлять надежную и эффективную синхронизацию данных:).

* Картинка взята с

Непонятные файлы на диске мы обнаруживаем двумя путями. Либо они явно видны в проводнике или файловом менеджере, либо к ним приводят поиски причины исчезновения свободного места на диске. Хорошо, если после удаления файлов, они больше не появляются. Но так бывает не всегда, и в этом случае приходится определять приложение, которое их создает.

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

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

Отслеживание активности

При запуске утилита отслеживает несколько типов системной активности:

  • реестр
  • файловую систему
  • процессы и потоки

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

Кроме того, убедитесь, что утилита отслеживает активность. Если у вас перечеркнута кнопка, которая на рисунке обведена красным, нажмите CTRL+E .

На рисунке выше активность отслеживается, причем только в файловой системе.

Основной фильтр

Теперь нужно применить фильтр, чтобы исключить не относящуюся к делу активность. Нажмите сочетание клавиш CTRL+L , и вы увидите возможности фильтрации. В Process Monitor сразу активны некоторые фильтры, исключающие отслеживание деятельности самой программы, а также некоторых системных компонентов (файла подкачки, таблицы MFT и т.д.). Это сделано для того, чтобы исключить мониторинг стандартной активности системы. В большинстве случаев удалять эти фильтры не нужно, и достаточно просто добавить свой.

На рисунке выше показан фильтр, который будет отслеживать создание и изменение всех файлов, в путях к которым содержится tmp _out . Давайте разберем фильтр подробнее слева направо:

  • Path . Путь в файловой системе. Также можно указывать разделы реестра, когда отслеживается активность в нем.
  • contains . Условие, по которому определяется поиск ключевого слова. В переводе с английского это слово означает «содержит». В зависимости от задачи можно конкретизировать условие, выбрав вариант begins with (начинается с) или ends with (заканчивается на).
  • tmp _out . Ключевое слово, которое в данном случае должно содержаться в пути. Имя файла и его расширение являются частью полного пути к файлу.
  • Include . Включение заданного условия в список отслеживаемых.

Не забудьте нажать кнопку Add , чтобы добавить фильтр в список. Впрочем, если вы забудете, Process Monitor напомнит об этом, прежде чем закрыть окно фильтров.

В данном случае я использовал часть имени файла в качестве ключевого слова, поскольку все непонятные файлы содержат в имени tmp_out. Если файлы создаются с разными именами, но зато в определенной папке, используйте путь к этой папке в качестве ключевого слова.

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

Проверить работу фильтра очень просто. Достаточно создать в текстовом редакторе файл с искомым именем или в наблюдаемой папке, и Process Monitor моментально отреагирует на это.

Дополнительные фильтры

Обратите внимание, что утилита зафиксировала не только активность блокнота, но также проводника и поиска Windows. Не относящиеся к делу процессы можно исключить из результатов, создав дополнительные фильтры. Достаточно щелкнуть по процессу правой кнопкой мыши и выбрать из контекстного меню пункт Exclude <имя процесса> . Это самый простой способ создания фильтра, но можно сделать это из окна фильтрации, как показано выше. В этом случае условие будет: Process Name – Is — <имя процесса> — Exclude .

Запись и открытие лога

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

Для сохранения лога в файл нажмите сочетание клавиш CTRL+B и укажите имя и желаемое расположение файла.

Изменения вступают в силу после перезапуска захвата активности. Теперь можно смело оставить Process Monitor включенным на длительное время, не опасаясь за лимит дискового пространства.

Остановить отслеживание активности можно сочетанием клавиш CTRL+E .

Впоследствии вы всегда сможете загрузить в утилиту лог из сохраненного файла. Закройте Process Monitor и дважды щелкните файл лога с расширением PML. Содержимое лога отобразится в окне Process Explorer.

Человек, обратившийся на форум с проблемой, так и не вернулся сообщить, помог ли ему мой совет. Но он был с таким вопросом не первый и, наверняка, не последний. Если вопрос возникнет у вас, вы сможете ответить на него с помощью Process Monitor.

О видео

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

Если честно, создание такого видео занимает намного больше времени, чем написание статьи. Поэтому я в любом случае не готов заменять печатный текст видеоматериалами. Но мне кажется, что в данном случае видео интереснее и понятнее. А что вы думаете по этому поводу?

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

Более подробный рассказ о Process Monitor и другие примеры его практического использования вы можете посмотреть в видео моего коллеги Василия Гусева , если у вас есть свободные 40 минут:)

Я бы хотел посвятить статью обзору API, предоставляемых разными ОС для слежения за изменениями в директории. Статья появилась как результат моей работы над демонами слежения за изменениями для утилиты dklab_realsync ( , github репозиторий) и своей собственной, которую я пока что не хочу анонсировать.

Windows, ReadDirectoryChangesW

Для операционной системы Windows есть замечательная функция ReadDirectoryChangesW , которая возвращает набор изменений для директории, в том числе содержит флаг для работы рекурсивно (bWatchSubtree). Таким образом, реализация слежения за изменениями в директории не представляет особого труда и в том же dklab_realsync реализация занимает 80 строк кода или 3.5 Кб. Интересно, что в Windows эти события поддерживаются даже через SMB!

Тем не менее, существуют определенные подводные камни:

  • конечный размер буфера изменений, после которого очередь событий переполнится и эти события будут потеряны
  • согласно документации к watchdog package , событие перемещения посылается раньше, чем изменения становятся видны в ФС
  • размер буфера ограничен в 64 Кб для сетевой ФС

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

Mac OS X, FSEvents

В Mac OS X также есть удобный и простой API для слежения за изменениями в файловой системе под названием FSEvents . С использованием этого API простейшая реализация демона составляет 50 строк кода или 1.8 кб. Очередь не может переполниться (!), но полное сканирование все же может потребоваться, если демон fseventsd «упадет». Стоит отметить, что этот API до версии 10.7 не предоставляет изменения по файлам, он сообщает только директории, в которых что-то изменилось. Поскольку события никуда не деваются и пишутся в лог (FSEvents service stores events in a persistent, per-volume database), детализация с точностью для директории позволяет сэкономить место на диске.

Вывод: FSEvents API для Mac OS X является самым необычным из всех подобных API. Очередь не переполняется и даже имеется возможность получить события из прошлого. Тем не менее, детализация событий дается с точностью до директории (до версии 10.7), что означает меньшую эффективность демона для синхронизации файлов.

Linux, inotify

В linux vanilla kernel существует один способ слежения за изменениями в директории - это inotify . Для этого API существует хорошая и подробная документация, но нет поддержки рекурсивного слежения за изменениями! Также, у inotify есть ограничение на максимальное количество объектов, за которыми можно следить. Простейшая реализация демона занимает уже 250 строк кода или 8 кб. Статическая сборка с использованием dietlibc занимает примерно 14 кб. Другим неприятным моментом является то, что приложение должно само поддерживать соответствия между watch descriptor (в нашем случае это всегда директория) и именем. Есть функция inotify_add_watch , которой передается путь до отслеживаемой директории, но нет обратной - inotify_get_path, которая бы возвращала этот самый путь по переданному дескриптору. События же содержат только watch descriptor и относительный путь до изменившегося файла внутри директории.

Подводные камни рекурсивного слежения за директорией через inotify:

  • Возможность переполнения очереди (длина очереди задается в /proc/sys/fs/inotify/max_queued_events)
  • Ограничение на максимальное количество объектов слежения (задается в /proc/sys/fs/inotify/max_user_watches)
  • Отсутствие возможности рекурсивного слежения за директорией
  • Необходимость отдельно обрабатывать случай, когда создается директория (например mkdir -p a/b/c). Вы получите событие о том, что создана директория «a», но пока вы навешиваете обработчик на эту директорию, в ней уже могут создать ещё одну директорию и событие об этом вам уже не придет.
  • Теоретическая возможность целочисленного переполнения watch descriptor (wd), так как он задается uint32

FreeBSD, Mac OS X, kqueue

FreeBSD и Mac OS X позволяют отслеживать за изменениями с помощью kqueue, который аналогичен inotify по своим характеристикам и также не имеет возможности рекурсивного слежения за директориями. Также, kqueue принимает в качестве аргументов дескрипторы открытых файлов (директорий), поэтому при использовании этого API ограничения на количество отслеживаемых директорий ещё более строгие.

Итого:

Как можно видеть, у всех API существуют свои достоинства и недостатки. Наименее удобными являются механизмы kqueue и inotify, но они же являются самыми эффективными и надежными. Коммерческие ОС предоставляют более удобные механизмы слежения за изменениями, но у них тоже есть свои особенности. Надеюсь, теперь вы имеете больше представления о том, как тяжела участь Dropbox и подобных программ, которым требуется со всем этим уживаться и осуществлять надежную и эффективную синхронизацию данных:).

* Картинка взята с

Если вы не единственный пользователь компьютера или просто хотите узнать, какие изменения произошли с вашими папками и файлами за определенный период времени, можно воспользоваться полезной утилитой .

Эти разработчики вообще предлагают массу замечательных бесплатных приложений, а самое главное, не обвешивают установщик тоннами бесполезных дополнительных панелей и программ «в нагрузку», как любят делать другие компании.

Что такое FolderChangesView?

FCV – это маленькая портативная утилита от Nirsoft Labs, позволяющая отслеживать содержимое папок или всего жесткого диска на наличие изменений. Программа выдает полный список созданных, измененных и удаленных файлов за весь период наблюдения. Можно следить не только за локальными дисками, но и за сетевыми (при наличии прав на их чтение).

Скачать FolderChangesView можно с . Ссылка для загрузки ZIP-архива с исполняемым файлом находится внизу страницы. Скачав программу, создайте на рабочем столе папку «FCV» (или с любым другим подходящим названием) и извлеките в нее содержимое архива.

Запуск и использование FolderChangesView

Поскольку FCV – портативная утилита, устанавливать ее не требуется. Просто откройте папку, в которую распаковали архив, и дважды щелкните на файле «FolderChangesView.exe». Возможно, потребуется подтвердить запуск приложения в окне контроля учетных записей.

После запуска выберите, за какой папкой хотите наблюдать, и нажмите «OK». После этого утилита начнет следить за папкой и всеми ее подпапками в соответствии с заданными параметрами. Например, мы решили понаблюдать за папкой «Downloads». Для этого мы указали ее адрес, как показано на скриншоте ниже.

После выбора папки можно изменить параметры мониторинга, показанные на скриншоте выше. Мы решили ничего не менять, но вы можете потом поэкспериментировать с настройками самостоятельно. И не волнуйтесь: настройки операционной системы от этого никак не изменятся, поэтому можно не бояться что-нибудь напортить.

Внесение изменений

Итак, мониторинг настроен, теперь можно изменить пару-тройку файлов и посмотреть, как это отразится в приложении. Мы, например, удалили из папки «Downloads» один файл, создали новую подпапку и переместили в нее существующие файлы.

Вот что FCV сообщает нам об этих изменениях:

Файл «Paragon Partition Ma…» удален.
Папка «New Folder» создана и изменена (изменение – это переименование папки).
Файл «VirtualBox-4.3.20-9699…» удален и создан. Другими словами, он был перемещен – то есть, удален из оригинальной папки «Downloads» и добавлен в папку «New Folder».
Файл «Oracle_VM_VirtualBox…» удален и создан – тоже по причине перемещения в другую папку.

Информация о файлах

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

1. Имя файла (Filename).
2. Количество изменений (Modified Count).
3. Количество созданий (Created Count).
4. Количество удалений (Deleted Count).
5. Полный путь к файлу (Full Path).
6. Расширение измененного файла (Extension).
7. Владелец файла (File Owner).
8. Время первого изменения (First Time Event).
9. Время последнего изменения (Last Time Event). Эти два столбца пригодятся в том случае, когда нужно узнать, сколько времени было потрачено, например, на редактирование документа Word.
10. Размер файла (File Size).
11. Время изменения (Modified Time). Этот столбец немного отличается от №№8 и 9: здесь указано время переименования или изменения различных атрибутов файла, а не время его открытия и сохранения.
12. Время создания (Created Time).
13. Атрибуты (Attributes).

Для удобства можно нажать на любом файле правой кнопкой мыши и выбрать пункт «Properties» («Свойства») – тогда всю эту информацию можно будет посмотреть в одном окне. Только не перепутайте с пунктом «File Properties» («Свойства файла»).

Материалы