我正在尝试将文本写入 .txt 文件,但它不起作用
I'm trying to write text to a .txt file but it doesn't work
当应用程序出现错误时,我正在尝试将一些信息写入文本文件。我将此代码添加到 global.asax
中的 Application_Error
方法,但它仍然不起作用:
void Application_Error(object sender, EventArgs e)
{
string path = Server.MapPath("Error.txt");
Exception ex = Server.GetLastError();
if (!File.Exists(path))
{
File.Create(path);
}
if (File.Exists(path))
{
TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("{0} : An Error Has Occurred, Error Description",DateTime.Now.ToString());
tw.WriteLine(@"{");
tw.WriteLine("Error Message: {0}", ex.Message);
tw.WriteLine("Source: {0}", ex.Source);
if (ex.StackTrace != null) tw.WriteLine("StackTrace: {0}", ex.StackTrace);
tw.WriteLine(@"}");
tw.Close();
}
}
如果有问题,我也会在出现错误时重定向到错误页面,这里是 web.config 文件:
<customErrors mode="On" defaultRedirect="ASPX/Error.aspx" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="ASPX/Error404.aspx"/>
</customErrors>
那么你知道我的代码有什么问题吗?我怎样才能让它把文本写入文件?
编辑:
我只需要 运行 vs 作为管理员,问题就解决了
您的问题可能是由于使用了 Server.MapPath
。
尝试更改:
string path = Server.MapPath("Error.txt");
类似于:
string path = String.Format("{0}\{1}", HttpRuntime.AppDomainAppPath, "Error.txt");
您的代码存在一个问题,即您的 File.Create
调用没有 using
块。问题是这个方法创建了一个文件和 returns 一个流。当您尝试写入文件时,流很可能仍会锁定该文件。
要解决此问题,您可以使用一个空的 using
块来关闭和处理流,如下所示:
if (!File.Exists(path))
{
using (File.Create(path)) { }
}
一个可能并不总是引起人们注意的相关问题是您没有处理 TextWriter
。您还应该将使用它的代码包装在 using
块中,以确保它得到处理(并且您可以删除对 .Close
的调用,因为这会自动发生):
using (TextWriter tw = new StreamWriter(path, true))
{
tw.WriteLine("{0} : An Error Has Occurred, Error Description",
DateTime.Now.ToString());
tw.WriteLine(@"{");
tw.WriteLine("Error Message: {0}", ex.Message);
tw.WriteLine("Source: {0}", ex.Source);
if (ex.StackTrace != null) tw.WriteLine("StackTrace: {0}", ex.StackTrace);
tw.WriteLine(@"}");
}
我只需要 运行 visual studio 作为管理员,不要浪费时间尝试添加更多 answers\comments,这个问题已解决
当应用程序出现错误时,我正在尝试将一些信息写入文本文件。我将此代码添加到 global.asax
中的 Application_Error
方法,但它仍然不起作用:
void Application_Error(object sender, EventArgs e)
{
string path = Server.MapPath("Error.txt");
Exception ex = Server.GetLastError();
if (!File.Exists(path))
{
File.Create(path);
}
if (File.Exists(path))
{
TextWriter tw = new StreamWriter(path, true);
tw.WriteLine("{0} : An Error Has Occurred, Error Description",DateTime.Now.ToString());
tw.WriteLine(@"{");
tw.WriteLine("Error Message: {0}", ex.Message);
tw.WriteLine("Source: {0}", ex.Source);
if (ex.StackTrace != null) tw.WriteLine("StackTrace: {0}", ex.StackTrace);
tw.WriteLine(@"}");
tw.Close();
}
}
如果有问题,我也会在出现错误时重定向到错误页面,这里是 web.config 文件:
<customErrors mode="On" defaultRedirect="ASPX/Error.aspx" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="ASPX/Error404.aspx"/>
</customErrors>
那么你知道我的代码有什么问题吗?我怎样才能让它把文本写入文件?
编辑: 我只需要 运行 vs 作为管理员,问题就解决了
您的问题可能是由于使用了 Server.MapPath
。
尝试更改:
string path = Server.MapPath("Error.txt");
类似于:
string path = String.Format("{0}\{1}", HttpRuntime.AppDomainAppPath, "Error.txt");
您的代码存在一个问题,即您的 File.Create
调用没有 using
块。问题是这个方法创建了一个文件和 returns 一个流。当您尝试写入文件时,流很可能仍会锁定该文件。
要解决此问题,您可以使用一个空的 using
块来关闭和处理流,如下所示:
if (!File.Exists(path))
{
using (File.Create(path)) { }
}
一个可能并不总是引起人们注意的相关问题是您没有处理 TextWriter
。您还应该将使用它的代码包装在 using
块中,以确保它得到处理(并且您可以删除对 .Close
的调用,因为这会自动发生):
using (TextWriter tw = new StreamWriter(path, true))
{
tw.WriteLine("{0} : An Error Has Occurred, Error Description",
DateTime.Now.ToString());
tw.WriteLine(@"{");
tw.WriteLine("Error Message: {0}", ex.Message);
tw.WriteLine("Source: {0}", ex.Source);
if (ex.StackTrace != null) tw.WriteLine("StackTrace: {0}", ex.StackTrace);
tw.WriteLine(@"}");
}
我只需要 运行 visual studio 作为管理员,不要浪费时间尝试添加更多 answers\comments,这个问题已解决