c# 在整个程序中动态地向文件添加文本

本文关键字:文件 添加 文本 动态 程序 | 更新日期: 2023-09-27 18:36:35

有一个测试类来创建我写入的日志文件。我希望能够通过引用类的 LogErrors 方法在整个程序内向文件添加文本。

public class test
{
public static string errorFileName = DateTime.Now.ToString("yyyy-MM-dd") + "testerrors.csv";
public static StreamWriter errorfile =  new StreamWriter("c:'" + @"'" + errorFileName, true);

  public static void LogErrors(string error, string record)
  {
    test.errorfilewriter.WriteLine( error + "," +  record );
  }
}

以下是我引用类以将记录附加到文件的地方:如果我的程序中遇到错误,我想引用该方法,然后将该行文本添加到文件中

test.LogErrors("INVALID RECORD", string.Join(",",line));

在那一行,我收到此错误:

The type initializer for program.Test threw an excpetion.
INNER EXCEPTION: The process cannot access the file c:'2013-10-21testerrors.csv because it is being used by another process. 

该文件刚刚在此程序期间创建,因此尚不存在,也不会在其他地方打开。

编辑:

public class test
{
   public static string errorFileName = DateTime.Now.ToString("yyyy-MM-dd") + "testERRORS.csv";
   private static object _lockObj = new Object();
  public static void LogErrors(string error, string record)
    {
        lock (_lockObj)
        {
            File.AppendAllText(Logging.errorFileName, error + "-" + record);
            //File.AppendAllLines does not exist in .NET 3.5
        }
    }
   test.LogErrors("INVALID",line));

我通过了测试。LogError 行,它会转到测试类,但是如果我在写入该行以测试文件后停止程序。文件中没有任何内容我也可以将锁定对象用于多个文件。因为我正在这个测试类中创建一堆日志文件。程序如何知道像c:/这样的文件放置在哪里正如流媒体作者所宣布的那样。

c# 在整个程序中动态地向文件添加文本

与其打开一个编写器,让它保持打开状态,不如利用AppendAllLines。因此,在 Logging 类中,构建一个名为 WriteLine 的方法:

public static void WriteLine(string line)
{
    lock (_lockObj)
    {
        File.AppendAllLines(pathToLogFile, line);
    }
}

其中_lockObj是在 Logging 类中定义的字段:

private static object _lockObj = new Object();

锁定在这里很重要。在实践中,在您的示例中,可能不会有多个线程写入它 - 但这是正确的做法。您必须确保两个线程不会同时访问该文件,因为操作系统不会像这样为您保护它。

此方法的另一个好处是,与打开文件关联的非托管内存现在由内置的 .NET frameworks 类管理,并且完全封装自代码。

您可能遇到锁定问题,因为文件正在尝试由两个不同的线程打开。

有许多线程安全的程序可以为您完成这项工作。

例如 http://nlog-project.org/