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(состояние объекта)
Ответы
Ответ 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