C # FileSystemWatcher Серьезная проблема? - PullRequest
3 голосов
/ 23 сентября 2010

Я реализовал FileSystemWatcher для папки, которая находится на NetworkStorage Device (без ОС).

Сценарий состоит в том, что у нас есть две машины, которые говорят, что машина A и машина B. мое приложение имеет две кнопки в моей форме Button1 и Button2.Я написал код для переименования файла Test.txt.

Button1: переименование файла Test.txt в Test007.txt и Button2: переименование файла Test007.txt в Test.txt

И предположим, что я одновременно запускаю этот файл exe из A и B,Затем я могу переименовать файл, нажав Button1 на компьютере A, и теперь, если я пытаюсь переименовать файл с другого компьютера B, он выдает ошибку

"System.ComponentModel.Win32Exception: указанный серверне может выполнить запрошенную операцию "

У кого-то есть идеи по этому поводу ... пожалуйста, помогите нам найти решение.У нас есть соответствующие права на папку.

Примечание: Код также работает для сетевой папки, поэтому код совершенен. Он просто не работает для NetworkStoreDevice.

Ответы [ 4 ]

5 голосов
/ 23 сентября 2010

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

Все работало отлично для ряда клиентов с довольно хорошей производительностью, пока мы не столкнулись с клиентом, у которого это работало только иногда.Особенно были проблемы, когда в папку было добавлено много файлов одновременно.

Проблема заключалась в том, что папка, которую мы наблюдали, находилась в общей папке в файловой системе samba, а FileSystemWatcher не работает надежно на общих файловых системах samba(Google для "FileSystemwatcher Samba").Поскольку вы говорите об «устройстве NetworkStorage», я предполагаю, что вы имеете в виду, что это NAS, и NAS довольно часто используют ОС Linux / Unix под капотами и предоставляют общий доступ с помощью samba.

Наше решение былодобавить функцию в наше программное обеспечение, чтобы оно могло быть настроено на использование опроса при необходимости.

3 голосов
/ 23 сентября 2010

FileSystemWatcher полагается на операционную систему, чтобы вызвать событие. Если на устройстве хранения нет ОС, то нет доступной ОС для создания события.

Обратите внимание, что несколько факторов могут влиять на то, какие события изменения файловой системы возникают, как описано ниже:

Обычные операции файловой системы могут вызывать более одного события. Например, когда файл перемещается из одного каталога в другой, могут возникнуть несколько событий OnChanged и некоторые события OnCreated и OnDeleted. Перемещение файла - это сложная операция, которая состоит из нескольких простых операций, поэтому вызывает несколько событий. Аналогично, некоторые приложения (например, антивирусное программное обеспечение) могут вызывать дополнительные события файловой системы, которые обнаруживаются FileSystemWatcher.

FileSystemWatcher может просматривать диски, если они не переключены или не удалены. FileSystemWatcher не вызывает события для CD и DVD, потому что метки времени и свойства не могут измениться. Для правильной работы компонента на удаленных компьютерах должна быть установлена ​​одна из необходимых платформ.

Если несколько объектов FileSystemWatcher отслеживают один и тот же UNC-путь в Windows XP до пакета обновления 1 или Windows 2000 с пакетом обновления 2 или более ранней версии, то только один из объектов вызовет событие. На машинах под управлением Windows XP SP1 и новее, Windows 2000 SP3 или новее или Windows Server 2003 все объекты FileSystemWatcher будут вызывать соответствующие события.

Установка свойства Filter не уменьшает то, что входит в буфер.

Обратите внимание, что FileSystemWatcher не вызывает событие Error, если событие пропущено или превышен размер буфера из-за зависимостей с операционной системой Windows. Чтобы не пропустить события, следуйте этим рекомендациям:

Увеличение размера буфера с помощью свойства InternalBufferSize может предотвратить пропущенные события изменения файловой системы.

Избегайте просмотра файлов с длинными именами. Рассмотрите возможность переименования с использованием более коротких имен.

Сохраняйте код обработки событий как можно короче.

Источник: Справочник по библиотеке MSDN: FileSystemWatcher Class

1 голос
/ 23 сентября 2010

FileSystemWatcher против опроса, чтобы наблюдать за изменениями файла

Смотрите первый ответ. Наблюдатели за файловой системой не надежны, особенно. по сети.

Похоже, это не относится к вашей проблеме, так как вы, кажется, получаете события, возможно, это проблема времени?

0 голосов
/ 23 сентября 2010

Используйте комбинацию FileSystemWatcher и Polling

FileSystemWatcher будет работать 90% времени, но добавляйте опрос каждые x минут, чтобы ловить все, что может пропустить ...

* 1004значение x зависит от того, насколько «в реальном времени» вам нужно быть
...