Вопрос по filesystemwatcher, c#, linux, samba – FileSystemWatcher с Samba в Linux

5

Я используюFileSystemWatcher в моем приложении C # (запущенном в Windows), чтобы обновить в моем приложении файлы, которые я сейчас просматриваю. Это хорошо работает, когда я просматриваю локальный каталог. Я получаю уведомление, когда файл переименовывается, удаляется или добавляется. Но, например, когда я в первый раз переименую файл на сетевом диске,FileSystemWatcher уведомляет меня о действии переименования, а затем, когда я переименовываю тот же файл или другой файл,FileSystemWatcher уведомляет меня об ошибке:

the specified server cannot perform the requested operation.

Тогда FileSystemWatcher не уведомит меня ни о чем.

Иногда я могу дважды переименовать, прежде чем FileSystemWatcher не сообщит мне ничего ...

Вот мой тестовый код:

    static void Main(string[] args)
    {
        FileSystemWatcher watcher = new FileSystemWatcher();
        watcher.Path = @"N:\prive\defFolder";

        watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite;

        watcher.Changed += new FileSystemEventHandler(watcher_Changed);
        watcher.Created += new FileSystemEventHandler(watcher_Changed);
        watcher.Deleted += new FileSystemEventHandler(watcher_Changed);
        watcher.Renamed += new RenamedEventHandler(watcher_Renamed);
        watcher.Error += new ErrorEventHandler(watcher_Error);

        watcher.EnableRaisingEvents = true;

        Console.Read();
        watcher.Dispose();
    }

    static void watcher_Error(object sender, ErrorEventArgs e)
    {
        Console.WriteLine("error : " + e.GetException().Message);
    }

    static void watcher_Renamed(object sender, RenamedEventArgs e)
    {
        Console.WriteLine("rename success");
    }

    static void watcher_Changed(object sender, FileSystemEventArgs e)
    {
        Console.WriteLine("change success");
    }
Клиент не работает в Windows, а сервер в Linux (Ubuntu Server 10.04) Akhilleus
Вы упоминаете linux, вы имеете в виду, что ваш клиентский код также работает на linux (то есть на Mono) или только на сервере с общим ресурсом Samba? Isak Savo
И добавить ... вы уверены, что у вас есть правильные привилегии на акции для выполнения этих действий? Файловая системаWatcher требует разрешения, изложенные здесьmsdn.microsoft.com/en-us/library/aa365465%28v=vs.85%29.aspx Nico

Ваш Ответ

2   ответа
5

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

Тем не менее, ваша конкретная проблема не кажется такой уж необычной. Я немного погуглил и нашел эти вещи:

Я предполагаю, что это проблема с определенными версиями (или конфигурацией) Samba в сочетании с Windows. Есть ли в логах Samba на сервере linux что-нибудь, что могло бы указать на причину проблемы?

В качестве немедленного решения я предлагаю вам попробовать следующее:

  • Add a polling mechanism that ensures that you do get the folder changes even if the FSW breaks down
  • When the FSW breaks, try to "restart" it by creating a new one. You may also want to check if EnableRaisingEvents is set to false when you get the error - maybe you can just set it to true to start receiving events again.
  • (Grasping for straws here) try playing around with the internal buffer size in case that's the problem (I doubt it, but it's worth a shot)
Большое спасибо, на самом деле я просто должен быть уведомлен, когда происходит изменение в каталоге, просмотренном пользователем. Моя проблема была в основном потерянные события после ошибки события. Создавая новыйFileSystemWatcher когда он ломается, меня постоянно уведомляют об изменениях файловой системы. Akhilleus
0
        if (Directory.Exists(monitorPath))  
        {
            watcher.Path = monitorPath;
            watcher.IncludeSubdirectories = true;
            watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.CreationTime;
            watcher.InternalBufferSize = 65536;
            watcher.Filter = "test_prod-Pg1_ICT*";
            watcher.Changed += new FileSystemEventHandler(fileChangedEvent);
            watcher.EnableRaisingEvents = true;
            LogEvent("Folder Syncronization Service is Started!");

        }

Я создал класс WindowSystemWatcher на основе службы Window для отслеживания общей папки Samba onChanges и использовал DifferenceEngine из CodeProject, чтобы проверить другое и скопировать в путь к общей папке Window, если есть изменения. Я также добавил таймер для проверки каждые 10 секунд для обработки при сбое сети. Существует список массивов для хранения количества изменений. Добавляется в список при возникновении события File Changed и удаляет список при успешном завершении.

Я протестировал два ноутбука HP на ОС Windows 7 Pro, работающие нормально.

Но не удалось работать на другом ноутбуке с Windows 7 Pro, а также с Windows XP Pro SP3 Desktop. (Мы находимся в той же сети компании / VLAN и пакет обновления)

Сбой означает, что если я внес что-то в общую папку Samba, он не будет синхронизировать последнее содержимое с путем совместного использования окна.

Я также добавил эти

[PermissionSetAttribute (SecurityAction.LinkDemand, Name = & quot; FullTrust & quot;)] [PermissionSetAttribute (SecurityAction.InheritanceDemand, Name = & quot; FullTrust & quot;)]

в верхней части кодировки, похоже, не работает

Похожие вопросы