2012-06-26 32 views
5

Tôi đã tạo một Dịch vụ Windows được cài đặt trong thư mục c:\Program Files\My Service. Cùng với tệp thực thi, tôi có tệp XML được cài đặt trong cùng một thư mục. Tệp XML này được dịch vụ sử dụng để nhận thông tin do người dùng xác định.Cách đọc tệp văn bản từ Dịch vụ Windows?

Trong đoạn mã của dịch vụ tôi đọc các tập tin như thể nó là địa phương để thực thi .. Ví dụ:

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

Tuy nhiên, khi tôi chạy dịch vụ, dịch vụ ném một ngoại lệ nói:

không thể tìm thấy tập tin 'C: \ Windows \ system32 \ Foo.xml'

Kể từ cuộc sống thực thi trong c:\Program Files\My Service tôi mong đợi Windows Ser để tìm tệp XML trong c:\Program Files\My Service\Foo.xml. Rõ ràng, đó không phải là trường hợp.

Làm cách nào để buộc dịch vụ tìm (tương đối) đối với tệp Foo.xml ở cùng một vị trí nơi dịch vụ có thể thực thi được?

+0

trùng lặp có thể xảy ra [Làm thế nào để tìm ra thư mục cài đặt của một dịch vụ Windows, sử dụng C#?] (Http://stackoverflow.com/questions/491735/how-do-i-find-the-install-directory-of-a-windows-service-using-c) –

+1

Chỉ cần xem xét, bạn * không nên * lưu trữ các cài đặt ứng dụng có thể định cấu hình trong thư mục tệp chương trình như truy cập để sửa đổi đường dẫn này yêu cầu đặc quyền. Thay vào đó, hãy xem xét sử dụng 'ApplicationData' /' LocalApplicationData'. –

+0

@QuintinRobinson - Cảm ơn bạn đã nhắc nhở! +1 – Jed

Trả lời

10

Sử dụng này:

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

Điều này sẽ giúp bạn có được những gì bạn cần

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

... ngoại trừ bạn không muốn mã hóa một đường dẫn mà người dùng có thể thay đổi khi cài đặt. –

+0

Tôi muốn tránh khó mã hóa đường dẫn đến tệp. Tôi muốn tham chiếu đến tệp liên quan đến tệp thực thi. – Jed

+0

Thay đổi nó để không bị mã hóa cứng nữa –

0

Như thư mục làm việc cửa sổ dịch vụ là C: \ Windows \ System32.

Để đọc file xml của bạn như mong đợi, bạn phải làm như sau

DataSet ds = new DataSet(); 
ds.ReadXml(Path.Combine(System.Reflection.Assembly.GetExecutingAssembly().Location, "Foo.xml")); 
Các vấn đề liên quan