【问题标题】:I'm trying to write text to a .txt file but it doesn't work [closed]我正在尝试将文本写入 .txt 文件,但它不起作用[关闭]
【发布时间】:2015-05-06 19:12:41
【问题描述】:

当应用程序出现错误时,我正在尝试将一些信息写入文本文件。我将此代码添加到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,问题就解决了

【问题讨论】:

  • 首先,您应该始终包含引发的异常类型、消息和堆栈跟踪。其次,应用程序在系统/域上具有标识的应用程序池下运行。此用途很可能无权将文件写入文件系统。
  • 您是否尝试过创建自定义类,然后添加该代码以查看它是否有效。如果您正在重定向到错误页面,您是否还考虑将代码放入该页面的 page_load 方法或在该页面中创建静态方法..?你有没有使用调试器..?它是否甚至达到了Application_Error 方法.. 如果是的话是哪一行导致了错误.. 这就是调试器的用途
  • “它不起作用”并不是一个真正有用的描述。当你调试它时,它在哪里失败?这段代码会被调用吗?执行的时候有没有错误?文件是否已创建?为什么不将此代码简化为 File.AppendAllText() 之类的代码?
  • 在 ASP.NET 应用程序中,您可能无权写入文本文件。您是否考虑过什么都不做并查看事件日志?还是实现ASP.NET Health Monitoring?它看起来很复杂,但通常只需将&lt;healthMonitoring enabled="true"/&gt; 添加到&lt;system.web&gt; 部分的web.config 中就足够了。
  • @Shaked Dahan 没问题,很高兴我能帮上忙。看看 elmah,我真的觉得你会喜欢的。

标签: c# asp.net streamwriter textwriter


【解决方案1】:

您的代码的一个问题是您的File.Create 调用没有using 块。问题是这个方法创建一个文件并返回一个流。当您尝试写入文件时,该流很可能仍会锁定该文件。

要解决此问题,您可以使用一个空的 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(@"}");
}

【讨论】:

  • 当然,除非文件不存在,否则第一个问题不会很明显!..
  • ty 试图提供帮助,但现在问题已解决,我只需要以管理员身份启动 Visual Studio
  • 没问题。但是,当文件不存在时,请尝试您的代码,并确保它不会引发异常...
【解决方案2】:

您的问题可能是由于使用了Server.MapPath

尝试改变:

string path = Server.MapPath("Error.txt");

类似于:

string path = String.Format("{0}\\{1}", HttpRuntime.AppDomainAppPath, "Error.txt");

【讨论】:

  • ty 试图提供帮助,但现在问题已解决,我只需要以管理员身份启动 Visual Studio
【解决方案3】:

我只需要以管理员身份运行visual studio,不要浪费时间尝试添加更多答案\cmets,这个问题已经解决了

【讨论】:

  • 它可能会为您解决,但不会为将来可能遇到相同问题的其他人解决。如果您自己找到了解决方案,请将其作为答案发布并接受您自己的答案。
猜你喜欢
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2020-09-07
  • 2019-05-08
  • 2011-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多