Файлы в каталоге просмотра заблокированы при использовании DirectoryInfo - PullRequest
0 голосов
/ 28 февраля 2011

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

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

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

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

0 голосов
/ 28 февраля 2011

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

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

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

        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
...