Служба 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");