Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Мониторинг папок на предмет добавления файлов


Автор: elena1212 13.8.2011, 10:02
Здравствуйте!
Прошу помощи вот по какому вопросу. Есть программа, которая с некоторой периодичностью (например, каждую минуту) просматривает каталог с целью выяснить, появились ли с момента запуска программы в каталоге или в подкаталогах любого уровня вложенности новые файлы. Если новые файлы обнаружены, то сведения о файлах пишутся в лог. Процедура сканирования работает следующим образом: 
Код

        public void ChangesFolders(DirectoryInfo DrInfo)
        {
            if (DrInfo.LastWriteTime > tmax)
            {

                FileInfo[] Fi = DrInfo.GetFiles();
                for (int i = 0; i < Fi.Length; i++)
                    if (Fi[i].LastWriteTime > tmax)
                    {
                        /* запись в лог */
                    }
                if (DrInfo.LastWriteTime > t)
                    t = DrInfo.LastWriteTime;
            }            
            DirectoryInfo[] folder = DrInfo.GetDirectories();
            for (int j = 0; j < folder.Length; j++)            
                ChangesFolders(folder[j]);
        }
 
Здесь 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
Цитата(WarHog @ 13.8.2011,  10:23)
а на http://msdn.microsoft.com/ru-ru/library/system.io.filesystemwatcher.aspx#Y3724 не смотрели? на появление файла/поддиректории ловите ивент Created и пишете в лог.

Да, смотрела, спасибо, сейчас как раз разбираюсь с этим, программный код еще не готов. Только я по безграмотности на класс FileSystemWatcher "наткнулась" уже в процессе поиска решения вышеозначенной проблемы. Надеюсь, решу с его помощью свою задачу более грамотно. И все равно это явление с памятью не дает мне покоя...

Автор: elena1212 14.8.2011, 08:01
С FileSystemWatcher вышло лучше! Есть некоторое неудобство в том, что объект данного класса нацелен на слежение за каталогом (позволяет отслеживать создание/удаление/изменение/переименование файлов и подкаталогов в нем), но не за его подкаталогами! Так как мне нужно следить за всеми подкаталогами любого уровня вложенности, я вынуждена при запуске приложения обойти все подкаталоги, для каждого создать объект класса FileSystemWatcher и указать каждому свой Path. И если подкаталоги переименовыаются, Path нужно менять. А если создаются новые подкаталоги, для них приходится досоздавать новые объекты FileSystemWatcher со своими Path. В моем случае это не беда, даже если таких объектов 1000, памяти требуется не так много (около 17000 КБ), а у меня больше не будет (а если мониторить таким образом, к примеру, все жесткие диски, нужно, по всей видимости, прибегать к другим средствам). Сейчас у меня "мониторят" 230 объектов FileSystemWatcher, загрузка ЦП 0, памяти 500 КБ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)