c# Добавлять текст в файл динамически по всей программе

Есть тестовый класс, который создает файлы журналов, в которые я пишу. Я хочу иметь возможность добавлять текст в файл во всей моей программе, ссылаясь на метод класса 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:/, как об этом заявлял стримрайтер.


person Jt2ouan    schedule 22.10.2013    source источник
comment
посмотрите на нижний (не принятый) ответ здесь   -  person Jonesopolis    schedule 22.10.2013


Ответы (2)


Вместо того, чтобы открывать средство записи и оставлять его открытым, просто используйте 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, который полностью инкапсулирован из вашего кода.

person Mike Perrenoud    schedule 22.10.2013

Вероятно, у вас есть проблемы с блокировкой, потому что файл пытаются открыть два разных потока.

Есть много потокобезопасных программ, которые сделают эту работу за вас.

например, http://nlog-project.org/

person Edmund Covington    schedule 22.10.2013