Почему File.ReadAllText в службе сбрасывает свой каталог до «C: \ Windows \ System32»? - PullRequest
0 голосов
/ 07 января 2019

Я создал службу , которая действует также как HTTPServer, я написал html-файлы и сохранил их в папке в том же рабочем каталоге (скажем, E:\My_project\Pages\home.html) У меня есть файл Library.cs в E:\My_project\. В моем коде у меня есть эта строка,

string content = File.ReadAllText("Pages/home.html");  

Когда я пытаюсь прочитать эту строку, я получаю следующую ошибку,

mscorlib: Could not find a part of the path 'C:\WINDOWS\system32\Pages\home.html'

Раньше это работало для некоторых других страниц, когда я жестко запрограммировал только домашнюю страницу и читал из этого каталога другие страницы, например 404.html. Теперь, когда я добавил домашнюю страницу также в папку страниц, я получаю эту ошибку.

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

ПРИМЕЧАНИЕ. Да, я использовал многопоточность, служба использует несколько потоков.

Код:

Library.cs

public static List<Route> GetRoutes() {
        List<Route> routes = new List<Route>();
        string content = File.ReadAllText("Pages/home.html");
        routes.Add(new Route
        {
            Name = "Hello Handler",
            UrlRegex = @"^/$",
            Method = "GET",
            Callable = (HttpRequest request) =>
            {
                return HttpBuilder.GetHome();
            }
        });
        return routes;
}

1 Ответ

0 голосов
/ 07 января 2019

Сервисные приложения похожи на обычные приложения Windows в их понимании «текущего каталога». Когда вы хотите получить доступ к файлу и передать относительное имя, ваше приложение пытается найти файл, выполнив поиск в: 1. Каталог, в который загружено приложение. 2. Текущий каталог. 3. Системный каталог Windows. Подробнее здесь

Теперь текущий каталог является чем-то особенным для каждого процесса, его можно настроить при запуске через параметры или во время выполнения, используя Directory.SetWorkingDirectory link .

В вашем случае вам нужно установить свой рабочий каталог, где находятся ваши веб-страницы.

...