gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:55:56 25 4
gpt4 key购买 nike

有一个测试类可以创建我写入的日志文件。我希望能够通过引用类的 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));

我通过了 test.LogError 行,它进入了测试类,但是如果我在程序写入该行以测试文件后停止程序。文件中没有任何内容我还可以对多个文件使用锁定对象吗?当我在这个测试类中创建一堆日志文件时。程序如何知道将文件(如流编写器声明的 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 框架类管理,并且完全封装在您的代码中。

关于c# 在整个程序中动态地向文件添加文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19521409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com