2017-09-13 3 views
0

Ok, voici la situation. J'ai écrit un service Windows. Le tester comme une application "console" a montré des résultats prometteurs.Où dois-je mettre des fichiers supplémentaires dans un service Windows?

Malheureusement, je ne sais pas où mettre un fichier. J'ai des données JSON qui sont critiques pour l'application. C'est dans un fichier. Je préférerais ne pas trop entrer dans les détails, mais sachez simplement que cela doit figurer dans un fichier, et c'est essentiel. Ce n'est pas un fichier de configuration, mais c'est définitivement nécessaire.

Quoi qu'il en soit, j'ai ajouté le fichier à mon projet de service Windows. Le problème est, je ne peux pas tout à fait comprendre le bon code et les paramètres à utiliser pour mettre le fichier au bon endroit lorsque le service est installé.

Ceci est seulement le deuxième service Windows que j'ai jamais écrit, et le premier (il y a quelques années) ne nécessitait pas de fichiers supplémentaires.

J'ai écrit le service dans Visual Studio 2015, sur Windows 7. Je vais le tester sur ma machine locale ici au bureau, mais il finira par fonctionner sur une machine de production.

Aide, s'il vous plaît? Des idées sur l'endroit où je devrais mettre le fichier et comment je devrais le référencer dans le code?

J'ai vu un site qui dit que je devrais utiliser ce qui suit:

System.IO.Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory); 

Mais cela ne semble pas aider quand je l'ai fait:

filePath = Environment.CurrentDirectory + "\\myfile.ext" 

Les chemins de fichiers ont jamais vraiment été Forte costume de la mienne dans ces cas.

Toute aide est grandement appréciée.

+1

On dirait qu'il ya trois questions ici: (1) où le fichier doit aller; (2) comment puis-je obtenir l'installateur pour le mettre là; et (3) comment puis-je le référencer dans le code. Si le fichier est en lecture seule, je pense que le placer dans le même répertoire que l'exécutable de service serait judicieux. La manière de procéder dépend de la technologie d'installation que vous utilisez, même si le scénario est si courant qu'il ne devrait pas être difficile. Quant à l'accès dans le code, ce que vous avez fait devrait fonctionner je pense, mais il n'y a pas vraiment besoin d'impliquer le répertoire courant, juste construire le chemin à partir de '.BaseDirectory' –

Répondre

3

Je ne l'ai pas testé, mais je ne vois aucune raison pour laquelle cela ne fonctionnerait pas:

internal string FilePath = 
    System.IO.Path.Combine(
     System.AppDomain.CurrentDomain.BaseDi‌​rectory, 
     Settings.Default.JsonFile); 
+1

Il serait préférable de faire 'FilePath = System.IO.Path.Combine (System.AppDomain.CurrentDomain.BaseDirectory, Settings.Default.JsonFile);', ce qui supprime toute possibilité de problèmes avec un '\' supplémentaire apparaissant soit le texte 'JsonFile' ou le texte' BaseDirectory'. –

+0

@Scott, merci, c'est fait. –

0

Ok, on dirait que j'ai compris cela. J'ai fait ce qui suit:

  1. Dans mon projet "Service" actuel, j'ai ajouté le fichier dont j'avais besoin.
  2. Dans le "programme" du service, je ne les suivantes:

    System.IO.Directory.SetCurrentDirectory (System.AppDomain.CurrentDomain.BaseDirectory);

    ServiceBase [] ServicesToRun;

    ServicesToRun = new ServiceBase [] { nouveau MyService() };

    ServiceBase.Run (ServicesToRun);

Et dans la classe qui surveille tout, je donne les résultats suivants:

internal string FilePath = Directory.GetCurrentDirectory() + "\\" + Settings.Default.JsonFile; 

Ensuite, il y avait quelques autres tweaks que j'ai fait qui ne sont pas pertinentes pour ce sujet, mais le ci-dessus semblait faire l'affaire.

+1

Cette approche est encore un peu risquée, car il peut se casser si quelque chose dans le code (y compris, par exemple, dans une classe .NET ou une bibliothèque tierce) décide de changer le répertoire courant. Il serait plus sûr d'utiliser le répertoire de base pour construire le chemin du fichier directement. –

+0

Merci, Harry! Je vais certainement prendre cela en délibéré. – MJR