FileSystemWatcher para ver la ruta UNC

No hay escasez de preguntas sobre este tema, pero sigo teniendo problemas. Aquí está mi situación. Tengo un servicio que necesito para ver una ruta que se especifica en el archivo de configuración. Funciona muy bien cuando utilicé un disco local.

Sin embargo, cuando lo cambio a algo como \\server2\secondary\temp\watch_folder el servicio no se inicia. El error en el registro es

El nombre del directorio \\ server2 \ secondary \ temp \ watch_folder no es válido.

Si copio eso directamente en Windows Explorer, la carpeta se abre bien. Si tomo mi código y lo pego en una aplicación antigua de Winforms, funciona bien. He probado todas las cuentas de “Iniciar sesión como”. Lo configuré para usar la cuenta de administrador, pero aún no hay dados.

Aquí está mi código:

 _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; 

¿Algunas ideas? Estoy perdido y en este momento creo que lo he estado mirando demasiado tiempo. Agradezco sinceramente cualquier ayuda.

Gracias, Nick

EDITAR Aquí está la excepción:

El servicio no puede iniciarse. System.ArgumentException: el nombre de directorio \ server2 \ Secondary \ temp \ watch_folder no es válido.
en System.IO.FileSystemWatcher.set_Path (valor de cadena)
en FileWatcher.FileWatcher.Watch ()
en FileWatcher.FileWatcher.OnStart (String [] args)
en System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback (estado del objeto)

Acabo de probar esto:

 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(); 

Eso funciona sin problemas, sin embargo, he replicado su excepción justo cuando:

  • El usuario en ejecución no tiene permisos para leer la carpeta remota.
  • La carpeta remota no existe.

Su problema seguramente está relacionado con los permisos, creo que el usuario en ejecución no tiene los permisos necesarios.

Otra cosa que puedes intentar es asignar la carpeta remota a un local.

Ejecute esto en el cmd:

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

Luego en tu código:

 _watcher.Path = @"Z:\"; 

Su servicio probablemente se está ejecutando en una cuenta de usuario que no tiene permiso para ese recurso compartido. Intente cambiar el servicio de Windows para ejecutarlo con credenciales diferentes.

Encontré una forma genial de obtener UNC con credenciales trabajando con FileSystemWatcher en un servicio de Windows en codeproject.

vea la publicación de Adrian Hayes: http://www.codeproject.com/Articles/43091/Connect-to-a-UNC-Path-with-Credentials

Su solución funciona como un regalo.

Es posible que necesite tener su camino como

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

También encontré este problema. Mi solución fue incluir el nombre de dominio de nuestra empresa en la ruta del servidor:

 \\servername.company.com\directorytowatch