Подтвердить что ты не робот

FileSystemWatcher для просмотра пути UNC

Нет вопросов по этой теме, но у меня все еще есть проблемы. Вот моя ситуация. У меня есть служба, которая мне нужна для просмотра пути, указанного в файле конфигурации. Он отлично работает, когда я использовал локальный диск.

Однако, когда я меняю его на нечто вроде \\server2\secondary\temp\watch_folder, служба не запускается. Ошибка в журнале

Недопустимо имя каталога \\server2\secondary\temp\watch_folder.

Если я скопирую его непосредственно в проводник Windows, папка откроется нормально. Если я возьму свой код и вставлю его в старое приложение Winforms, он отлично работает. Я пробовал все учетные записи "Вход в систему". Я установил его для использования учетной записи администратора, но все равно не кубик.

Вот мой код:

_watcher = new FileSystemWatcher();
_watcher.Path = ConfigurationManager.AppSettings["WatchFolder"];
_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
_watcher.Filter = "*.txt";
_watcher.Created += new FileSystemEventHandler(OnCreated);
_watcher.Error += new ErrorEventHandler(OnError);
_watcher.EnableRaisingEvents = true;

Любые идеи? Я в недоумении, и в этот момент я думаю, что слишком долго смотрел на него. Я искренне ценю любую помощь.

Спасибо, Ник

ИЗМЕНИТЬ Вот исключение:

Служба не может быть запущена. System.ArgumentException: имя каталога \server2\Secondary\temp\watch_folder недействительно.
   в System.IO.FileSystemWatcher.set_Path (значение строки)
   в FileWatcher.FileWatcher.Watch()
   в FileWatcher.FileWatcher.OnStart(String [] args)
   в System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(состояние объекта)

4b9b3361

Ответ 1

Я просто попробовал это:

var _watcher = new FileSystemWatcher();
_watcher.Path = @"\\10.31.2.221\shared\";
_watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName;
_watcher.Filter = "*.txt";
_watcher.Created += new FileSystemEventHandler((x, y) =>Console.WriteLine("Created"));
_watcher.Error += new ErrorEventHandler( (x, y) =>Console.WriteLine("Error"));
_watcher.EnableRaisingEvents = true;
Console.ReadKey();

Это работает без проблем, однако я реплицировал ваше исключение, только когда:

  • У работающего пользователя нет разрешений на чтение удаленной папки.
  • Удаленная папка не существует.

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

Еще одна вещь, которую вы можете попробовать - сопоставить удаленную папку с одним локальным.

Выполните это в cmd:

NET USE Z: \\server2\Secondary\temp\watch_folder /user:Domain\UserName Password

Затем в вашем коде:

_watcher.Path = @"Z:\";

Ответ 2

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

Ответ 3

Я нашел действительно классный способ получить UNC с учетными данными, работающими с FileSystemWatcher, в службе windows на codeproject.

см. сообщение Адриана Хейса: http://www.codeproject.com/Articles/43091/Connect-to-a-UNC-Path-with-Credentials

Его решение работает.

Ответ 4

Возможно, вам нужно иметь свой путь как

\\server2\\Secondary\\temp\\watch_folder

Ответ 5

Я также столкнулся с этой проблемой. Мое решение состояло в том, чтобы включить доменное имя нашей компании в путь к серверу:

\\servername.company.com\directorytowatch