2013-10-22 12 views
2

쓰는 로그 파일을 만드는 테스트 클래스를 만듭니다. 클래스의 LogErrors 메서드를 참조하여 내 프로그램 전체에서 파일에 텍스트를 추가 할 수 있기를 원합니다. 오류가 내 프로그램에 발생하는 경우 을 그때 방법을 참조 파일C# 프로그램 전체에서 동적으로 파일에 텍스트 추가

test.LogErrors("INVALID RECORD", string.Join(",",line)); 
에 텍스트의 라인을 추가 할 : 나는 파일에 레코드를 추가 할 수있는 클래스를 참조하는 경우 여기에

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); 
    } 
} 

입니다 아직 존재하지 않고 다른 곳에서 오픈되지 않도록

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 라인을 과거이게하고 테스트 클래스로 이동하지만 프로그램을 중지하면이 라인은 파일을 테스트 씁니다 후. 파일에 아무것도 없습니다. 둘 이상의 파일에 대해 잠금 객체를 사용할 수도 있습니다. 이 테스트 클래스에서 많은 로그 파일을 만들고 있습니다. Streamwriter가이를 선언 할 때 c : /와 같은 파일을 어디에 배치해야하는지 프로그램에서 어떻게 알 수 있습니까?

+0

모습 (http://stackoverflow.com/questions/4010543/lock-in-a-static-method/4010606#4010606) – Jonesopolis

답변

2

라이터를 열고 여는 대신에 AppendAllLines을 사용하십시오. 그래서, Logging 클래스, WriteLine라는 방법을 구축 :

private static object _lockObj = new Object(); 

잠금 여기에 중요하다 _lockObjLogging 클래스에 정의 된 필드

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

. 실제로, 당신의 예제에서는 쓰레드가 하나 이상 쓰이지 않을 것입니다.하지만 옳은 일입니다. 운영 체제가이를 보호하지 않기 때문에 두 개의 스레드가 동시에 해당 파일에 액세스하지 않도록해야합니다.

이 접근법의 또 다른 이점은 파일 열기와 관련된 관리되지 않는 메모리가 이제 내장 .NET Framework 클래스에 의해 관리되고 코드에서 완전히 캡슐화된다는 점입니다.

0

파일이 두 개의 다른 스레드에 의해 열리기 때문에 잠금 문제가있을 수 있습니다.

이 작업을 수행 할 수있는 스레드 안전 프로그램이 많이 있습니다. (거절) 하단 [여기]에서 대답

http://nlog-project.org/