2012-06-26 8 views
5

Ho creato un servizio di Windows che viene installato in una directory c:\Program Files\My Service. Insieme all'eseguibile, ho un file XML che viene installato nella stessa directory. Questo file XML viene utilizzato dal servizio per ottenere informazioni definite dall'utente.Come leggere un file di testo da un servizio di Windows?

Nel codice del servizio che ho letto il file come se fosse locale per l'eseguibile .. Esempio:

DataSet ds = new DataSet(); 
ds.ReadXml("Foo.xml"); 

Tuttavia, quando si esegue il servizio, il servizio genera un'eccezione dicendo:

Impossibile trovare il file 'C: \ Windows \ system32 \ foo.xml'

Poiché la vita eseguibili in c:\Program Files\My Service mi aspettavo il Ser di Windows vice per cercare il file XML in c:\Program Files\My Service\Foo.xml. Ovviamente, non è così.

Come posso forzare il servizio a visualizzare (relativamente) il file Foo.xml nella stessa posizione in cui risiede l'eseguibile del servizio?

+0

possibile duplicato di [Come faccio a trovare la directory di installazione di un servizio di Windows, utilizzando C#?] (Http://stackoverflow.com/questions/491735/how-do-i-find-the-install-directory-of-a-windows-service-using-c) –

+1

Solo una considerazione, * non è necessario * memorizzare le impostazioni configurabili dell'applicazione in la directory dei file di programma come accesso per modificare questo percorso richiede privilegi. Prendi invece in considerazione l'uso di 'ApplicationData' /' LocalApplicationData'. –

+0

@QuintinRobinson - Grazie per il promemoria! +1 – Jed

risposta

10

Utilizzare questa:

System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Foo.xml"); 
0

questo modo si ottiene quello che ti serve

DataSet ds = new DataSet(); 
ds.ReadXml(System.IO.Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location,"Foo.xml"); 
+1

... tranne per il fatto che non si desidera codificare manualmente un percorso che l'utente può modificare durante l'installazione. –

+0

Voglio evitare di codificare il percorso del file. Voglio che il riferimento al file sia relativo all'eseguibile. – Jed

+0

Cambiato in modo che non sia più codificato –

0

Come directory di lavoro del servizio di Windows è C: \ Windows \ System32.

Per poter leggere il file XML come previsto, si deve fare come sotto

DataSet ds = new DataSet(); 
ds.ReadXml(Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location, "Foo.xml")); 
Problemi correlati