2017-09-13 1 views
0

Ok, hier ist die Situation. Ich habe einen Windows-Dienst geschrieben. Testen Sie es als eine "Konsole" App hat vielversprechende Ergebnisse gezeigt.Wo lege ich Zusatzdateien in einen Windows-Dienst ein?

Leider kann ich nicht herausfinden, wo ich eine Datei ablegen soll. Ich habe einige JSON-Daten, die für die Anwendung wichtig sind. Es ist in einer Datei. Ich möchte lieber nicht zu sehr ins Detail gehen, sondern nur wissen, dass es in einer Datei sein muss, und es ist kritisch. Es ist keine Konfigurationsdatei, aber es wird definitiv benötigt.

Wie auch immer, ich habe die Datei zu meinem Windows-Service-Projekt hinzugefügt. Das Problem ist, ich kann den richtigen Code und die richtigen Einstellungen nicht herausfinden, um die Datei an den richtigen Ort zu bringen, wenn der Dienst installiert wird.

Dies ist nur der zweite Windows-Dienst, den ich jemals geschrieben habe, und der erste (vor Jahren) erforderte keine zusätzlichen Dateien.

Ich schrieb den Dienst in Visual Studio 2015, auf Windows 7. Ich werde es auf meinem lokalen Computer hier im Büro testen, aber es wird schließlich auf einer Produktionsmaschine gehen.

Hilfe, bitte? Irgendwelche Ideen, wo ich die Datei ablegen sollte und wie ich sie im Code referenzieren sollte?

sah ich eine Website, die sagte ich folgendes verwenden sollte:

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

Aber das schien nicht zu helfen, wenn ich dies tat:

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

Dateipfade haben nie wirklich ein Starke von mir in diesen Fällen.

Jede Hilfe hier wird sehr geschätzt.

+1

Sieht aus wie es hier drei Fragen sind: (1), wo sollte die Datei gehen; (2) Wie bekomme ich den Installierer, um es dort zu setzen? und (3) wie referenziere ich es im Code. Wenn die Datei schreibgeschützt ist, wäre es sinnvoll, sie in dasselbe Verzeichnis wie die ausführbare Datei des Diensts zu stellen. Wie Sie dies tun würden, hängt davon ab, welche Installer-Technologie Sie verwenden, obwohl es ein so häufiges Szenario ist, dass es nicht schwierig sein sollte. Wenn Sie darauf im Code zugreifen, sollte das, was Sie getan haben, funktionieren, denke ich, aber es gibt keine wirkliche Notwendigkeit, das aktuelle Verzeichnis einzubeziehen. Konstruieren Sie einfach den Pfad von '.BaseDirectory'. –

Antwort

3

ich nicht getestet, aber ich sehe keinen Grund, warum es nicht funktionieren würde:

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

Es wäre besser zu tun 'FilePath = System.IO.Path.Combine (System.AppDomain.CurrentDomain.BaseDirectory, Settings.Default.JsonFile);', das alle Möglichkeiten von Problemen mit zusätzlichen '\' von beiden entfernt der 'JsonFile'-Text oder der' BaseDirectory'-Text. –

+0

@Scott, danke, fertig. –

0

Ok, es sieht so aus, als hätte ich das herausgefunden. Ich tat folgendes:

  1. In meinem eigentlichen "Service" -Projekt fügte ich die Datei hinzu, die ich brauchte.
  2. Im "Programm" des Dienstes, habe ich folgendes:

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

    ServiceBase [] ServicesToRun;

    ServicesToRun = new Servicebase [] { neue MyService() };

    ServiceBase.Run (ServicesToRun);

Und innerhalb der Klasse, die alles überwacht, ich habe folgendes:

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

Dann gibt ein paar andere Verbesserungen waren, die ich gemacht, die dieses Thema nicht relevant sind, aber die oben schien den Trick zu machen.

+1

Dieser Ansatz ist immer noch ein * bisschen * riskant, weil Es kann beschädigt werden, wenn irgendetwas im Code (z. B. in einer .NET-Klasse oder einer Drittanbieterbibliothek) das aktuelle Verzeichnis ändert. Es wäre sicherer, das Basisverzeichnis zu verwenden, um den Dateipfad direkt zu erstellen. –

+0

Danke, Harry! Ich werde das sicherlich in die Beratung einbeziehen. – MJR

Verwandte Themen