该过程无法访问文件' C:\ file.txt'因为它被另一个进程

时间:2016-11-09 20:34:05

标签: c# logging text-files streamwriter

我正在尝试在我的程序上记录每个方法,我在IIS服务器上部署了应用程序,用户只是打电话给我并说电子邮件功能不起作用所以我需要基本上运行应用程序但是将每个步骤记录到一个txt文件。

我宣布以下是全球价值:

StreamWriter writer = new StreamWriter("C:\\file.txt");

然后我在下面的代码中使用它:

Method 1
{
  if (file1.HasFile)
 {
 writer.WriteLine("Has File");
}
}

方法2

private Boolean InsertUpdateData(SqlCommand cmd)
        {
 writer.WriteLine("Insert Started" + DateTime.Now.ToString());
}

所以在我的情况下,方法一个运行正常并且它写入了文件但是当它进入第二个方法时我得到的文件已经打开,这是正确的我该如何解决这个问题?

谢谢

全球价值 - 在顶部宣布

namespace WorkOrderManagement
{
    public partial class CreateWorkOrder : System.Web.UI.Page
    {
        bool successfull;
        string path;
        string name;
        string content;
        string datas;
        string ext;
        bool affectedrows;
        string seasonalsupervisor;
        private string sLogFormat;
        private string sErrorTime;

        StreamWriter writer = new StreamWriter("C:\\file.txt");

3 个答案:

答案 0 :(得分:2)

我真的建议您放弃使用全局变量来表示流然后尝试在不同方法中使用它的想法。这在桌面应用程序中很简单,但在ASP.NET应用程序中要复杂得多。

有一些简单的替代方法可以自动编写日志文本并使文件保持解锁状态。

例如,您可以使用这样的方法

public static class Log
{
    public static string _file = "log.txt";
    public static object _locked = new object();

    public static void AppendToLog(string text)
    {
         lock(_locked)
         {
             string path = Server.MapPath("~/APP_DATA");
             File.AppendAllText(Path.Combine(path, _file), text + Environment.NewLine);
         } 
    }
}

现在您可以使用

调用日志写入
Log.AppendToLog("My message");

我想强调两件重要的事情。首先,我不写在服务器的根驱动器中。当您在没有权限使用站点根目录之外的任何服务器的情况下部署ASP.NET应用程序时,这是一种不好的做法,并且始终是问题的根源。因此,ASP.NET系统在您的站点根目录下定义一个名为APP_DATA的特定文件夹,您的应用程序应具有读/写权限。 要注意的第二点是使用lock关键字。这在像ASP.NET这样的环境中是必要的,其中两个用户可以到达需要写入公共日志文件的代码点。正如MSDN解释的那样

  

lock关键字确保一个线程不会输入关键字   代码段,而另一个线程在临界区。如果   另一个线程试图输入一个锁定的代码,它会等待,阻止,   直到对象被释放。

答案 1 :(得分:1)

您也可以这样做来关闭文件流

using (StreamWriter writer = new StreamWriter("C:\\file.txt"))
{
   //your code here
}
//this automatically closes the stream, and it is more recommended.

答案 2 :(得分:0)

写完文件后关闭流

Method 1
{
  if (file1.HasFile)
 {
 writer.WriteLine("Has File");
 writer.Close();
 }
}