| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Мониторинг папок на предмет добавления файлов |
| Автор: elena1212 13.8.2011, 10:02 | ||
| Здравствуйте! Прошу помощи вот по какому вопросу. Есть программа, которая с некоторой периодичностью (например, каждую минуту) просматривает каталог с целью выяснить, появились ли с момента запуска программы в каталоге или в подкаталогах любого уровня вложенности новые файлы. Если новые файлы обнаружены, то сведения о файлах пишутся в лог. Процедура сканирования работает следующим образом:
Здесь t и tmax - глобальные переменные: tmax хранит последнее время изменения каталога, а в t записывается новое время изменения катклога. Алгоритм рекурсивного обхода заимствован и выполнен по мотивам http://msdn.microsoft.com/ru-ru/library/bb513869.aspx. Задачу свою программа решает, но имеются проблемы. Во-первых, с ростом количества каталогов и уровня вложенности растет загрузка ЦП, но это мне представляется объяснимым, поскольку в данном случае растет количесво операций. Во-вторых, монотонно возрастает количество используемой памяти. Это приводит к тому, что через несколько часов нагрузка на ОС становится просто непреемлемой. Пожалуйста, объясните, из-за чего происходит постоянный рост памяти?? Неужели из-за объявлений FileInfo[] Fi и DirectoryInfo[] folder? Подскажите, пожалуйста, как мне решить возникшую проблему? Или решать поставленную задачу необходимо другими средствами? Большое спасибо! |
| Автор: WarHog 13.8.2011, 10:23 |
| а на http://msdn.microsoft.com/ru-ru/library/system.io.filesystemwatcher.aspx#Y3724 не смотрели? на появление файла/поддиректории ловите ивент Created и пишете в лог. |
| Автор: elena1212 13.8.2011, 10:47 | ||
Да, смотрела, спасибо, сейчас как раз разбираюсь с этим, программный код еще не готов. Только я по безграмотности на класс FileSystemWatcher "наткнулась" уже в процессе поиска решения вышеозначенной проблемы. Надеюсь, решу с его помощью свою задачу более грамотно. И все равно это явление с памятью не дает мне покоя... |
| Автор: elena1212 14.8.2011, 08:01 |
| С FileSystemWatcher вышло лучше! Есть некоторое неудобство в том, что объект данного класса нацелен на слежение за каталогом (позволяет отслеживать создание/удаление/изменение/переименование файлов и подкаталогов в нем), но не за его подкаталогами! Так как мне нужно следить за всеми подкаталогами любого уровня вложенности, я вынуждена при запуске приложения обойти все подкаталоги, для каждого создать объект класса FileSystemWatcher и указать каждому свой Path. И если подкаталоги переименовыаются, Path нужно менять. А если создаются новые подкаталоги, для них приходится досоздавать новые объекты FileSystemWatcher со своими Path. В моем случае это не беда, даже если таких объектов 1000, памяти требуется не так много (около 17000 КБ), а у меня больше не будет (а если мониторить таким образом, к примеру, все жесткие диски, нужно, по всей видимости, прибегать к другим средствам). Сейчас у меня "мониторят" 230 объектов FileSystemWatcher, загрузка ЦП 0, памяти 500 КБ. |