Служба Windows обращается к неверному каталогу с помощью StreamReader

Я читаю файл, который находится в том же каталоге, что и мой исполняемый файл, используя StreamReader с помощью следующего метода:

StreamReader reader=new StreamReader(".\\file.txt"); //NOTE: 2nd backslash is escape character in C#

Когда я делаю это в среде отладки, он хорошо читает файл, но когда я устанавливаю службу, он пытается прочитать файл в C:\Windows\System32\ как будто рабочий каталог установлен по этому пути, но в свойствах сервисов нет опции рабочего каталога. Я предполагаю, что он использует рабочий каталог sc.exe.

Есть ли способ, которым я могу получить разрешение для определения местоположения текущего исполняемого файла, используя относительные пути к файлам? Потому что служба может быть размещена в разных местах в зависимости от развертывания.

1 ответ

Решение

Да, рабочий каталог службы %WinDir%\System32.Также GetModuleFileName() вернет неверный результат, потому что ваша служба размещена на другом исполняемом файле (случайно помещенном и в этот каталог).

Вы должны найти исполняющую сборку и ее местоположение, описать дольше, чем сделать:

string assemblyPath = Assembly.GetExecutingAssembly().Location;

Теперь просто извлеките имя каталога и объедините его с нужным файлом:

string path = Path.Combine(Path.GetDirectoryName(assemblyPath), "file.txt");
Другие вопросы по тегам