Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Мониторинг папок на предмет добавления файлов, Проблема с памятью 
:(
    Опции темы
elena1212
Дата 13.8.2011, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.8.2011

Репутация: нет
Всего: нет



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

        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? Подскажите, пожалуйста, как мне решить возникшую проблему? Или решать поставленную задачу необходимо другими средствами? Большое спасибо!
PM MAIL   Вверх
WarHog
Дата 13.8.2011, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: нет
Всего: 2



а на FileSystemWatcher не смотрели? на появление файла/поддиректории ловите ивент Created и пишете в лог.
--------------------
PM MAIL   Вверх
elena1212
Дата 13.8.2011, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.8.2011

Репутация: нет
Всего: нет



Цитата(WarHog @ 13.8.2011,  10:23)
а на FileSystemWatcher не смотрели? на появление файла/поддиректории ловите ивент Created и пишете в лог.

Да, смотрела, спасибо, сейчас как раз разбираюсь с этим, программный код еще не готов. Только я по безграмотности на класс FileSystemWatcher "наткнулась" уже в процессе поиска решения вышеозначенной проблемы. Надеюсь, решу с его помощью свою задачу более грамотно. И все равно это явление с памятью не дает мне покоя...
PM MAIL   Вверх
elena1212
Дата 14.8.2011, 08:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 13.8.2011

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) elena1212 - 14.8.2011, 08:36
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0428 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.