2012-06-26 18 views
5

Zrobiłem usługę Windows, która zostanie zainstalowana w katalogu c:\Program Files\My Service. Wraz z plikiem wykonywalnym mam plik XML, który zostanie zainstalowany w tym samym katalogu. Ten plik XML jest używany przez usługę do uzyskiwania informacji zdefiniowanych przez użytkownika.Jak odczytać plik tekstowy z usługi Windows?

W kodzie usługi czytałem plik tak, jakby to były lokalne do wykonywalnego .. przykład:

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

Jednak, kiedy uruchomić usługę, usługa zgłasza wyjątek mówiąc:

nie można odnaleźć pliku 'C: \ Windows \ system32 \ Foo.xml'

Od wykonywalnych mieszka w c:\Program Files\My Service spodziewałem Windows Ser vice szukać pliku XML w c:\Program Files\My Service\Foo.xml. Oczywiście tak nie jest.

Jak zmusić usługę do wyświetlenia (względnie) pliku Foo.xml w tym samym miejscu, w którym znajduje się plik wykonywalny usługi?

+0

możliwy duplikat [Jak mogę znaleźć katalogu instalacyjnego usługa systemu Windows, przy użyciu C#?] (Http://stackoverflow.com/questions/491735/how-do-i-find-the-install-directory-of-a-windows-service-using-c) –

+1

Tylko rozważanie * nie powinieneś * przechowywać konfigurowalnych ustawień aplikacji w katalog plików programu jako dostęp do modyfikacji tej ścieżki wymaga uprawnień. Zamiast tego rozważ użycie 'ApplicationData' /' LocalApplicationData'. –

+0

@QuintinRobinson - Dzięki za przypomnienie! +1 – Jed

Odpowiedz

10

użyj:

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

to będzie Ci to, czego potrzebujesz

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

... z tą różnicą, że nie chcesz na sztywno zakodować ścieżki, którą użytkownik może zmienić podczas instalacji. –

+0

Chcę uniknąć sztywnego kodowania ścieżki do pliku. Chcę, aby odniesienie do pliku było względne do pliku wykonywalnego. – Jed

+0

Zmieniono tak, aby nie był już na stałe oznaczony –

0

jako usługa Windows katalogu roboczym C: \ Windows \ System32.

Aby odczytać plik xml jak oczekiwano, co musisz zrobić, jak poniżej

DataSet ds = new DataSet(); 
ds.ReadXml(Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location, "Foo.xml")); 
Powiązane problemy