2011-10-24 4 views
10

파일이 아직없는 경우에만 만들고 싶습니다.
같은 코드 :존재하지 않는 경우에만 파일 만들기

if (!File.Exists(fileName)) 
{ 
    fileStream fs = File.Create(fileName); 
} 

파일이 "만약"에 "생성"사이에 생성 될 경우에 경쟁 조건에 대한 열려 둡니다.

어떻게 피할 수 있습니까?

편집 : 그것은 다른 프로세스 (동일한 응용 프로그램의 여러 인스턴스를) 때문에 여기에 사용할 수 없습니다
잠금.

+0

try {} catch {}? – ojlovecd

+0

동일한 애플리케이션입니까? 뮤텍스? –

답변

9

크리스티안 펜 (Kristian Fenn)의 대답은 필자가 필요한 파일 모드와 거의 같았습니다. 이것이 내가 찾고 있었던 것입니다 :

FileStream fs = new FileStream(fileName, FileMode.CreateNew); 
1

파일을 만들려는 경쟁 시도가 동일한 프로세스에있는 경우 코드 주위에 lock 문을 사용하여 충돌을 방지 할 수 있습니다.

그렇지 않은 경우 File.Create를 호출 할 때 가끔 예외가 발생할 수 있습니다. 그 예외를 적절하게 처리하십시오. 던져진 예외가 상대적으로 비싸기 때문에 파일이 존재할 때 예외를 처리하는 경우에도 작성하기 전에 파일이 존재하는지 확인하는 것이 좋습니다. 경쟁 조건의 확률이 낮은 경우에만 권장되지는 않습니다.

+1

내가 사용하는 소프트웨어를 쓰지 않기를 바랍니다. 어림짐작보다 안전 보장. – reinierpost

19

또한 하나 개 이상의 스레드가 아마 당신은 예외를 얻을 것이다 파일에 액세스하려고 것처럼 스레드 잠금으로 보일 것입니다, 그러나

FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate); 

사용할 수 있습니다.

+0

MSDN은 해당 생성자가 스레드 안전성 여부를 명시하지 않으므로 멀티 스레드 환경에서주의를 촉구하는 것이 좋습니다. –

+1

두 스레드가 동시에 시도하면 ['CreateFile'] (http://msdn.microsoft.com/en-us/library/aa363858(VS.85) .aspx)와 같은 결과를 얻게됩니다 ('FileStream' 생성자는 동시에 호출되는 Win32에 대한 래퍼입니다. 하나의 스레드가 이깁니다. 이해할 수 있듯이 커널 수준에서 이것은 단일 작업입니다. 한 스레드는 생성하지 않고 다른 스레드는 열린 상태로 만듭니다. – Richard

+0

리차드에게 감사드립니다. –

1

먼저 코드 부분을 잠그기 위해 Lock 또는 Monitor.Enter 또는 TryEnter API를 잠급니다. 두 번째로 FileStream API를 FileMode.OpenOrCreate API와 함께 사용할 수 있습니다. 파일이 존재하면, 파일을 사용하거나 다른 파일을 만듭니다.

3

이것은 더 나은 해결책이 아닙니다. using(var stream...) IO 예외를 피하기 위해 스트림을 닫는 데 사용하십시오.

if (!File.Exists(filePath)) 
{ 
    using (var stream = File.Create(filePath)) { } 
} 
관련 문제