C# C类库:StreamWriter写入system32文件夹

C# C类库:StreamWriter写入system32文件夹,c#,logging,class-library,error-logging,streamwriter,C#,Logging,Class Library,Error Logging,Streamwriter,我有一个类库,它部署在ISP服务器上,供ASP.NET web服务使用。我希望跟踪任何错误,在这种情况下,我无法访问windows事件日志。所以我想我应该使用StreamWriter类写入一个txt文件。问题是,若我并没有给出它试图写入C:\Windows\System32的绝对路径和文件名,那个么这对我并没有好处。 我如何告诉它使用数据目录或应用程序根目录?有什么想法吗?试试看: Application.StartupPath; 这里有一个 获取可执行文件的路径 启动了应用程序,而不是 包括

我有一个类库,它部署在ISP服务器上,供ASP.NET web服务使用。我希望跟踪任何错误,在这种情况下,我无法访问windows事件日志。所以我想我应该使用StreamWriter类写入一个txt文件。问题是,若我并没有给出它试图写入C:\Windows\System32的绝对路径和文件名,那个么这对我并没有好处。 我如何告诉它使用数据目录或应用程序根目录?有什么想法吗?

试试看:

Application.StartupPath;
这里有一个

获取可执行文件的路径 启动了应用程序,而不是 包括可执行文件名

注意:您仍然需要添加文件名。

请尝试签出:

Application.StartupPath;
这里有一个

获取可执行文件的路径 启动了应用程序,而不是 包括可执行文件名


注意:您仍然需要添加文件名。

您可以通过以下操作找到可执行文件的路径:

string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

通过执行以下操作,可以找到可执行文件的路径:

string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);

在我的web产品中,我在web.config中指定一个appSettings块,如下所示:

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

然后,您可以让安装程序将其配置到您想要的任何位置。您可能不希望将日志文件放在应用程序目录中。

在我的web产品中,我在web.config中指定一个appSettings块,如下所示:

<configuration>
    <appSettings>
      <add key="MyLogPath" value="LogPath" />
    </appSettings>
</configuration>
然后,您可以让安装程序将其配置到您想要的任何位置。您可能不希望日志文件位于应用程序目录中。

使用Server.MapPath获取与web应用程序相关的路径

using (FileStream fs = new FileStream(Server.MapPath("~/logs/logfile.txt"),
                                      FileMode.Append)) {
  //do logging here.
}
虽然之前的一些海报建议使用反射来获取正在执行的程序集,但我不确定这是否会使您获得web应用程序或w3wp进程。如果是后者,您仍将尝试写入System32文件夹。

使用Server.MapPath获取相对于web应用程序的路径

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

虽然之前的一些海报建议使用反射来获取正在执行的程序集,但我不确定这是否会使您获得web应用程序或w3wp进程。如果是后者,您仍将尝试写入System32文件夹。

这是我以前使用的,虽然有点笨重,但它完成了任务:

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只是我编的一个枚举…

这是我以前使用的,有点笨重,但它完成了任务:

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只是我编的一个枚举…

当我在本地托管的解决方案上尝试时,我在\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\中找到了一个路径。。这不是我真正想要的。啊,我的错,这不适用于ASP.NET web服务。使用Server.MapPath方法。不过,您仍然需要对目标文件夹的写入权限。当我在本地托管的解决方案上尝试此操作时,我会在\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\中找到一个路径。。这不是我真正想要的。啊,我的错,这不适用于ASP.NET web服务。使用Server.MapPath方法。不过,您仍然需要对目标文件夹的写入权限。是的,但我需要记录类库DLL,而不是web产品。您也可以在类库项目中放置app.config来实现这一点。我还可以使用相对于应用程序的路径吗?我并没有真正使用安装程序,只是复制/发布到ISP提供给我的虚拟目录。对不起,我指的是安装程序,就像安装应用程序的人一样。正如EJC所指出的,您可以提供库可以使用的任意app.config文件。是的,但我需要记录类库DLL,而不是web产品。您也可以在类库项目中放置app.config来实现这一点。我还可以使用相对于应用程序的路径吗?我并没有真正使用安装程序,只是复制/发布到ISP提供给我的虚拟目录。对不起,我指的是安装程序,就像安装应用程序的人一样。正如EJC所指出的,您可以提供库可以使用的任意app.config文件。我无法从类库应用程序访问System.Windows.Forms.Application.StartupPath,可以吗?我无法从类库应用程序访问System.Windows.Forms.Application.StartupPath,可以吗,我将在这里发布使用Server.MapPath的日志类的代码。。。我用它来登录我的类库和网站。如果我能找到代码,我最近改用ELMAH和Log4Net…比我聪明先生:我没有找到真正的使用方法,而是伪造了一个页面,以便使用Server.MapPath met
霍德:你说的很有道理,我将在这里发布我的代码,用于使用Server.MapPath的日志类。。。我用它来登录我的类库和网站。如果我能找到代码,我最近改用ELMAH和Log4Net…比我聪明先生:我没有找到真正的使用方法,而是伪造了一个页面,这样我就可以使用服务器。MapPath方法:是的,只要你添加对系统的引用,这个方法就行。Web Assembly就像我说的,有点笨重,但它完成了任务也许我说了很多笨重的东西…是的,只要你给系统添加一个引用,这就行了。就像我说的,网页组装有点笨重,但它完成了任务也许我说了很多笨拙的话。。。