C#类库:StreamWriter写入system32文件夹
我有一个类库,部署在ISP服务器上供ASP.NET Web服务使用。我想跟踪任何错误,在这种情况下,我无法访问Windows事件日志。所以我想我会使用StreamWriter类写入一个txt文件。问题是如果我不给绝对路径,而只是试图写入C:\ Windows \ System32的文件名,那对我来说就没有好处。 如何告诉它可能使用数据目录或应用程序根目录?有什么想法吗?C#类库:StreamWriter写入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只是一个枚举我编了......
尝试检查出来:
Application.StartupPath;
这里有一个link to the docs
获取可执行文件 启动应用程序,而不是 包括可执行文件名的路径。
string path = Application.StartupPath;
注意:您仍然需要添加一个文件名。
我不能从一个类库访问System.Windows.Forms.Application.StartupPath应用程序,我可以吗? – 2010-09-29 19:44:37
是的,右键单击引用并导入System.Windows.Forms – 2010-09-29 20:27:10
你可以这样做找出你的可执行文件的路径:
string path = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
当我尝试在我的本地托管解决方案时,我在\ Microsoft.NET \ Framework \ v2.0.50727 \ Temporary ASP.NET Files \ ..中获得了一个路径真的不是我所追求的。 – 2010-09-29 19:40:18
啊我的不好,这不适用于ASP.NET web服务。使用Server.MapPath方法。尽管如此,您仍然需要对目标文件夹的写入权限。 – BrokenGlass 2010-09-29 19:49:01
在我的网络产品,在web.config我指定的appSettings块这样的:
<configuration>
<appSettings>
<add key="MyLogPath" value="LogPath" />
</appSettings>
</configuration>
这你可以使用从代码如
ConfigurationManager.AppSettings["MyLogPath"]
然后你可以让安装程序配置它,无论你在哪里想。您可能不希望日志文件在您的应用程序目录中。
是的,但我需要类库DLL来登录,而不是网络产品。 – 2010-09-29 19:41:31
你也可以在你的类库项目中添加一个app.config来实现这个 – EJC 2010-09-29 20:09:24
我仍然可以使用相对于应用程序的路径吗?我真的不想使用安装程序,只需复制/发布到ISP给我的虚拟目录即可。 – 2010-09-29 20:14:48
使用Server.MapPath
获取相对于Web应用程序的路径。
using (FileStream fs = new FileStream(Server.MapPath("~/logs/logfile.txt"),
FileMode.Append)) {
//do logging here.
}
虽然以前的一些海报都使用反射来得到执行大会的建议,我不知道是否这将加快您的Web应用程序或w3wp进程。如果是后者,您仍然会尝试写入System32文件夹。
是的,只要你添加一个引用System.Web程序集 – 2010-09-29 20:30:47
就像我说的,有点笨重,但它完成工作。 :)也许我说了很多笨蛋...... – EJC 2010-09-29 20:42:28