2017-01-26 5 views
1

에 대한 프로그램 실행은 내가 삭제하고 내 응용 프로그램과 같이 시작 때마다 작성 로그 파일이있을 때 액세스 예외가 발생됩니다 :File.AppendAllText는 두 번째

if (File.Exists(LogPath)) 
{ 
    File.Delete(LogPath); 
    File.Create(LogPath); 
} 

을 내가 쓰고 있어요 그것과 같이 File.AppendAllText 사용에 :

File.AppendAllText(LogPath, logMessage); 

내 문제는 내가 두 번째 시간 동안 프로그램을 실행하면, 위의 호출이 파일에 액세스 할 수 없습니다 말을 던져 질 수있는 예외가 발생한다는 것입니다

이 방법에 어떤 문제가 "다른 프로세스에서 사용하고 있기 때문에"?

+0

프로그램의 두 인스턴스가 동시에 실행되고 있습니까? –

+0

이 LogPath에서 지정한 파일에 영향을주는 유일한 코드입니까? 나는 당신이 File.AppendAllText (LogPath, logMessage);에 도착하기 전에'File.Delete (LogPath); '와의 오류를 예상했을 것입니다. –

답변

0

추가 처리를 위해 파일을 만든 후에는 파일을 닫아야합니다.

if (File.Exists(LogPath)) 
{ 
    File.Delete(LogPath); 
    using(var handler = File.Create(LogPath)) 
    { 

    } 
} 

다른 방법으로는 WriteAllText를 사용할 수 있으며 매번 삭제할 필요가 없습니다.

File.WriteAllText(LogPath, "contents"); 
+1

'(var handler = File.Create (LogPath)) {...}'를 사용하는 것이 더 좋은 기술입니다. 문맥 상 'IDisposable' (문맥상의 스트림)을 수동으로 닫지 마십시오. –

+0

OK @DmitryBychenko 감사합니다.) –

3

이 코드의 대신이 라인 때문이 아니라 File.AppendAllText입니다 만 :

File.Create(LogPath); 

으로 the documentation of File.Create(string) 당 :

반환 값
형식 : System.IO.FileStream
path에 지정된 파일에 대한 읽기/쓰기 액세스를 제공하는 FileStream입니다. 오픈 FileStream 객체 반환이

. 스트림을 닫고 파일을 릴리스하려면이 객체를 처리해야합니다. 그렇지 않으면이 객체는 GC가 어느 정도 나중에 불확실한 시점에서 객체를 마무리 할 때까지 파일을 열어 두게됩니다. 다음

이 프로그램이 파일을 실행 한 두 번째 시간이 존재
File.Create(LogPath).Dispose(); 
using (File.Create(LogPath)) { } 

무슨 일이하는 것을, 당신이 그것을 삭제 있도록 :

여기에 다음과 같은 두 가지 대안 중 하나가 작동 중,이 코드 라인을 작성하는 방법 다시 만들었지 만 "다시 만들었습니다"부분은 파일을 열어 두었으므로 잠시 후에 File.AppendAllText 메서드에 도달하면 파일이 아직 열렸습니다.

: 이미 존재하지 않는 경우 항상 전화 File.AppendAllText 당신은 단순히 the documentation of File.AppendAllText에 따라, 파일을 생성합니다 AppendAllText로, 삭제 할 수있는 경우 :

파일을 엽니 다, 지정된 문자열을 파일에 추가 한 다음 파일을 닫습니다. 파일이 없으면이 메서드는 파일을 만들고 지정된 문자열을 파일에 기록한 다음 파일을 닫습니다.

(내 강조)

4

그것은 File.Create()에 의해 발생합니다. 그것을 제거하면 File.AppendAllText은 존재하지 않는 경우 새 파일을 만듭니다.

참고 :
File.Create() 당신이 그것을 처리하지 않는 경우에 당신이 그것을 액세스 할 때, 그것은 오류가 발생합니다하는 FileStream 값을 반환합니다.

+0

코드가 처음에는 작동하지만 두 번째는 작동하지 않는 이유는'create()'호출이 처음 만들어진 절을 입력하지 않기 때문입니다. – arbitrarystringofletters

+0

맑은 데요, 고마워요! – Toto

0

당신, 아마, 당신이 청소를 조합 한 통화에 쓰기 시도 할 수

// clear the file (write an empty text to it) if it exists 
if (File.Exists(LogPath)) 
{ 
    File.WriteAllText(LogPath, ""); 
}  
...  
File.AppendAllText(LogPath, logMessage); 

의미 : 파일이 존재하는 경우

File.WriteAllText(LogPath, logMessage); 

WriteAllText 그것을 취소하고 logMessage를 기록합니다; 파일이 없으면 WriteAllText을 작성하고 logMessage을 작성하십시오.