2012-04-18 2 views
3

의 여러 인스턴스에서 파일로 올바른 방법으로?쓰기 텍스트 프로그램

+1

파일이 처음 사용되는지 확인해보십시오.이 답변보기 http://stackoverflow.com/a/937558/799586 –

+2

@BaliC : 파일이 잠겨 있는지 처음 검사 할 때 유일한 문제는 여전히 확인한 시간과 열어 본 시간 사이에 잠겨 있습니다. 파일에 쓰고 예외가 발생하면 catch하는 것이 좋습니다. 그런 다음 나중에 다시 시도하십시오. –

답변

1

는 항상 using

using(TextWriter tw2 = File.AppendText(@"C:\logs\log.txt")) 
{ 
    tw2.WriteLine(Environment.NewLine); 
    tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER"); 
    //tw2.Flush(); // No need to flush because close alway flush. 
} 

using 문은 블록의 끝에서 tw2.Close()를 호출에 이러한 종류의 코드를 캡슐화합니다.
블록 내부에서 예외가 발생하는 경우에도 마찬가지입니다.

은 이제 응용 프로그램의 다른 인스턴스가 어떤 이유로 실패 할 경우, 파일은 더 이상 여러 프로세스에서 로그 파일에 대한 액세스를 동기화하는

+1

암시 적 클로즈가 스트림을 플러시하기 때문에 플러시가 필요하지 않습니다. – Polyfun

+0

'Close'도 'using'도 예외가 발생하는 것을 막지 않으며 예외의 확률을 감소시킵니다. 동시에 여러 프로그램 인스턴스가 동시에 로그 파일을 열려고 시도 할 가능성이 있습니다. 파일에 대한 액세스는 뮤텍스와 같은 적절한 동기화 프리미티브와 동기화되어야합니다. –

+0

@ 예외가 발생하지만 예외가 발생하지만 파일을 올바르게 닫은 다음 다른 프로세스가 잠긴 상태에서 파일을 사용할 수 있습니다 (플러시, 사용자 및 ShellShock이 맞으면 복사 붙여 넣기 :). – Steve

0

Flushing 외에도 Close() 파일을 사용해야합니다. 다른 인스턴스가 동시에 파일을 작성하면 다른 프로그램이 Close()를 호출 할 때까지

게다가, 당신은 (그것을 액세스 할 수 없습니다.

TextWriter.Close Method

Closes the current instance of writer and releases any system resources associated with the writer

을이 경우 "시스템 자원은 "당신이 그것을 닫을 때까지 잠겨 보관하는 파일을 의미합니다.

0

당신은 각각의 시간을 닫을 필요하면 텍스트 작가와 열린 파일.

그래서 각 작업 후 사용

// create a writer and open the file 
TextWriter tw2 = File.AppendText(@"C:\logs\log.txt"); 

// write a line of text to the file 
tw2.WriteLine(Environment.NewLine); 
tw2.WriteLine(DateTime.Now + " " + "IN INFOSERVCALLER"); 
tw2.Flush(); 
tw2.Close(); 

그 후에 다시 어떤 문제를 만들지 않으려 고합니다.

1

사용 Mutex 클래스를 고정하지 않습니다. 파일을 열기 전에 WaitOne으로 전화하고 파일을 닫은 후에 ReleaseMutex으로 전화하십시오 (플러시만으로 충분하지 않습니다. 다른 답변과 마찬가지로 키워드를 사용하여 파일을 닫거나 포장해야합니다). 뮤텍스 이름은 접두어 "Global \"로 시작해야합니다.