Файлы в Watch Directory блокируются при использовании DirectoryInfo

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

Может ли кто-нибудь сказать мне, сталкивались ли они с проблемами, и если да, то как вы их решили?

Спасибо,


person Researcher    schedule 28.02.2011    source источник
comment
Я обнаружил, что файлы были заблокированы при использовании FileWatcher - маловероятно....   -  person Mitch Wheat    schedule 28.02.2011
comment
вы обрабатываете файлы во время мониторинга через filewatcher. вам нужно изящно закрыть дескрипторы файлов в вашем приложении.   -  person Mubashir Khan    schedule 28.02.2011
comment
опубликуйте свой код - что вы делаете, когда у вас есть новый файл?   -  person VinayC    schedule 28.02.2011


Ответы (2)


Вы уверены, что все, что создает/обновляет файлы, выполнено? В противном случае файл будет заблокирован.

person jason    schedule 28.02.2011
comment
Существует процесс A, который создает 2 файла (один размером 1 КБ, другой размером 67 МБ) и помещает их в папку n/w. Эти файлы загружаются, а затем удаляются другим процессом B через 4–5 часов. Что делает мое приложение, так это то, что оно проверяет папку с момента поступления файла до момента его удаления, и если файлы удаляются, приложение отправляет уведомление о том, что файлы были удалены. Я обнаружил, что процесс B мог загрузить и удалить файл меньшего размера, но у большего файла всегда были проблемы с удалением. Я не обрабатываю ни один из файлов. - person Researcher; 28.02.2011

Несмотря на то, что FileWatcher должен работать с общими ресурсами UNC, у меня было множество проблем при этом. Поскольку ваша проблема не критична по времени, я бы создал поток, который просто проверяет наличие файлов, спит несколько секунд в цикле, пока файлы не исчезнут, и в это время будет отправлено ваше предупреждение.

NB: Запуск в качестве службы требует, чтобы работающий пользователь также имел сетевые привилегии на удаленном общем ресурсе.

Обновление: только что провел быстрый тест в нашей сети. Клиент под управлением Windows 7 сервер под управлением Windows 2008 R2. Добавил в общий ресурс несколько файлов, как маленьких, так и больших. Не было никаких проблем с удалением файлов во время работы кода. Даже без Thread.Sleep

        bool filesDeleted = false;

        while (!filesDeleted)
        {
            DirectoryInfo di = new DirectoryInfo(@"\\server\share\path\");
            FileInfo[] files = di.GetFiles();

            foreach (var file in files)
            {
                DateTime created = file.CreationTime;
                string fileName = file.Name;

                //Do what every you need to check if the two files are still there
            }

            Thread.Sleep(5000);
        }

        //Send alert
person Paaland    schedule 28.02.2011
comment
Вот как работает приложение. Проверяет файлы, спит, снова проверяет файлы. Служба Windows имеет сетевые привилегии, и я могу успешно узнать, что один из файлов был удален. Однако приложение, которое удаляет файлы, не может удалить больший из двух файлов. Похоже, что на файл наложена некоторая блокировка во время работы приложения-наблюдателя. Может ли finfFileList = DirectoryInfo.getFiles() в контрольном каталоге с последующим доступом к finfFileList.creationtime случайно блокировать файл, который я просматриваю? - person Researcher; 28.02.2011
comment
Ах, извините. Я думал, что вы использовали класс FileSystemWather. Я не думаю, что он не должен накладывать на них какие-либо блокировки, но служба индексирования или антивирус могут сканировать файлы. У меня были похожие проблемы с удалением больших файлов образов ISO. В моем случае удаление разрешения индексировать файлы и папки в папках (дополнительные атрибуты) исправило это. - person Paaland; 28.02.2011
comment
Когда приложение-наблюдатель не запущено, файлы можно загружать и удалять. Только когда приложение-наблюдатель запускается и наблюдает за каталогом, кажется, что на файл наложены блокировки, и файл не может быть удален приложением, загружающим файл, и мы должны фактически вручную удалить файл из папки позже. - person Researcher; 28.02.2011
comment
Почему вы проверяете finfFileList.creationtime? Имеет ли значение для вас, когда файлы были созданы? В вашем описании говорится только об отправке оповещения, когда два конкретных файла исчезли. Как определить их в первую очередь? - person Paaland; 28.02.2011
comment
Исходное приложение также проверяло наличие файлов и сохраняло время их создания. Ну, я могу обойтись без времени создания. Мне просто было интересно узнать время создания. Что ж, я беру список файлов, которые находятся в каталоге просмотра, и периодически получаю список файлов в каталоге и сравниваю с тем, что у меня есть, что дает мне список файлов, которые были недавно получены, и те, которые были удалены. - person Researcher; 28.02.2011
comment
Приложение для просмотра точно такое же, как и ваш фрагмент кода, за исключением того, что общий путь к серверу получается только один раз в начале приложения. Также хотел добавить, что оба файла в просматриваемом каталоге передаются по FTP. - person Researcher; 28.02.2011