Библиотека классов C #: запись StreamWriter в папку system32 - PullRequest
1 голос
/ 29 сентября 2010

У меня есть библиотека классов, которая развернута на сервере ISP для использования веб-службой ASP.NET.Я хотел бы отслеживать любые ошибки, и в этом случае журнал событий Windows недоступен для меня.Поэтому я решил написать в текстовый файл, используя класс StreamWriter.Проблема в том, что я не даю абсолютный путь и просто имя файла, который он пытается записать в C: \ Windows \ System32, и это мне не подходит.Как я могу сказать ему использовать каталог данных или корень приложения?Есть мысли?

Ответы [ 5 ]

3 голосов
/ 29 сентября 2010

Используйте Server.MapPath, чтобы получить путь относительно веб-приложения.

using (FileStream fs = new FileStream(Server.MapPath("~/logs/logfile.txt"),
                                      FileMode.Append)) {
  //do logging here.
}

Хотя некоторые из предыдущих постеров предлагали использовать отражение для получения исполняемой сборки, я не уверен, действительно лиэто даст вам веб-приложение или процесс w3wp.Если это последнее, вы все равно будете пытаться писать в папку System32.

2 голосов
/ 30 сентября 2010

Вот то, что я использовал, это немного неуклюже, но оно выполняет свою работу:

using System;
using System.Collections.Generic;
using System.Web.UI;

public static class Logger
{
private static readonly Page Pge = new Page();
        private static readonly string Path = Pge.Server.MapPath("~/yourLogPath/Log.txt");
        private const string LineBreaker = "\r\n\r======================================================================================= \r\n\r";

public static void LogError(string myMessage, Exception e)
{
    const LogSeverity severity = LogSeverity.Error;
    string messageToWrite = string.Format("{0} {1}: {2} \r\n\r {3}\r\n\r {4}{5}", DateTime.Now, severity, myMessage, e.Message, e.StackTrace, LineBreaker);
    System.IO.File.AppendAllText(Path, messageToWrite);
}
}

У меня был этот класс в его собственном проекте, отдельно от самого сайта, и я использовал егово всех других моих проектах, не связанных с веб-сайтами ...

Редактировать: Кстати, LogSeverity - это просто перечисление, которое я составил ...

1 голос
/ 29 сентября 2010

В моем веб-продукте в web.config я указываю блок appSettings, подобный этому:

<configuration>
    <appSettings>
      <add key="MyLogPath" value="LogPath" />
    </appSettings>
</configuration>

, который вы можете использовать из кода, например

ConfigurationManager.AppSettings["MyLogPath"]

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

0 голосов
/ 29 сентября 2010

Вы можете узнать путь к вашему исполняемому файлу, выполнив это:

string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
0 голосов
/ 29 сентября 2010

Попробуйте проверить:

Application.StartupPath;

Вот ссылка на документы

Получает путь к исполняемому файлу. который запустил приложение, а не включая имя исполняемого файла.

string path = Application.StartupPath;

Примечание: вам все равно нужно добавить имя файла.

...