web-dev-qa-db-fra.com

FileSystemWatcher pour regarder le chemin UNC

Les questions sur ce sujet ne manquent pas, mais j'ai toujours des problèmes. Voici ma situation. J'ai un service dont j'ai besoin pour regarder un chemin spécifié dans le fichier de configuration. Cela fonctionne très bien quand j'ai utilisé un lecteur local. 

Cependant, lorsque je le change en quelque chose comme \\server2\secondary\temp\watch_folder, le service ne démarre pas. L'erreur dans le journal est 

Le nom du répertoire \\ server2\secondary\temp\watch_folder n'est pas valide.

Si je copie cela directement dans l'Explorateur Windows, le dossier s'ouvre correctement. Si je prends mon code et le colle dans une ancienne application Winforms, cela fonctionne bien. J'ai essayé tous les comptes "Log On As". Je l'ai configuré pour utiliser le compte administrateur, mais toujours pas de dés.

Voici mon code:

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

Des idées? Je suis perdue et je pense que je la regarde depuis trop longtemps. J'apprécie sincèrement toute aide.

Merci, Nick

EDIT Voici l'exception:

Le service ne peut pas être démarré. System.ArgumentException: le nom de répertoire\server2\Secondary\temp\watch_folder n'est pas valide.
at System.IO.FileSystemWatcher.set_Path (valeur de chaîne)
sur FileWatcher.FileWatcher.Watch ()
sur FileWatcher.FileWatcher.OnStart (String [] args)
at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback (état de l'objet)

21
nickfinity

Je viens d'essayer ceci:

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

Cela fonctionne sans problème, mais j’ai répliqué votre exception au moment même où:

  • L'utilisateur en cours d'exécution ne dispose pas des autorisations nécessaires pour lire le dossier distant.
  • Le dossier distant n'existe pas.

Votre problème est sûrement lié aux autorisations, je pense que l'utilisateur en cours d'exécution ne dispose pas des autorisations nécessaires.

Une autre chose que vous pouvez essayer est de mapper le dossier distant à un local.

Exécutez ceci dans le cmd:

Net Use Z: \\server2\Secondary\temp\watch_folder /user:Domain\UserName Password

Puis dans votre code:

_watcher.Path = @"Z:\";
19
Marco Medrano

Votre service est probablement en cours d'exécution sous un compte d'utilisateur qui n'a pas l'autorisation de ce partage. Essayez de changer le service Windows pour qu'il s'exécute sous différentes informations d'identification.

5
John Koerner

J'ai trouvé un moyen vraiment intéressant d'obtenir UNC avec des informations d'identification fonctionnant avec FileSystemWatcher dans un service Windows sur codeproject.

voir Adrian Hayes post: http://www.codeproject.com/Articles/43091/Connect-to-a-UNC-Path-with-Credentials

Sa solution fonctionne un régal.

2
John

Vous devrez peut-être avoir votre chemin comme

\\server2\\Secondary\\temp\\watch_folder
0
Thor Burfine

J'ai aussi rencontré ce problème. Mon correctif consistait à inclure le nom de domaine de notre société dans le chemin du serveur:

\\servername.company.com\directorytowatch
0
Chris