2014-12-29 2 views
2

내 응용 프로그램에서 다음 코드 조각이 : 디렉토리. 시간에 민감한 존재인가?

if (!Directory.Exists(myPath)) 
    Directory.CreateDirectory(myPath); 

나는 정기적으로 단위 테스트를 실행하면

가끔 가끔하지, 전달합니다. 디렉토리는 항상 존재합니다. (나는 그것을 확신했기 때문에 기술적으로 결코 코드에 의해 "생성"되지 않습니다). 하지만 매번 한 번씩 Directory.Exists(myPath)false을 반환하므로 코드를 만들어 폴더를 만든 다음 UnauthorizedAccessException!

여기에 재밌는 점은 CreateDirectory에 중단 점을 넣은 다음 노란 화살표를 테스트 위로 이동하면 테스트가 true을 반환합니다!

무슨 일 이니?

myPath\\nameOfLocalMachine\sharedFolder입니다. 공유는 안정적이고 지속적으로 사용됩니다. NET 4.0

방금 ​​피들러가 3000 시퀀스 요청을 시뮬레이트했습니다. 175 실패 ... 모두 같은 메시지와 함께 : 경로에

액세스를 '\ nameOfLocalMachine \ sharedFolder \ randomFileName.json가'

+0

프로덕션 코드에서 동일한 두 줄이 있습니다. Didnt는 이것을 가로 질러왔다. – Sievajet

+0

무엇이 myPath인가? –

+0

어떤 버전의 Windows, .NET 및 로컬, UNC 또는 매핑 된 드라이브로가는 경로입니까? – David

답변

3

을 거부이 사고는 Windows에서 아주 정상입니다. 프로그램은 이와 같은 디렉토리에서 핸들을 열고 공유 삭제을 지정합니다. 어떤 프로그램이 그것을 사용하고 있지만 누구도 디렉토리를 삭제할 수 있습니다. 해당 핸들이 닫힐 때까지 디렉토리는 실제로 파일 시스템에서 사라지지 않습니다. 다음은 그 디렉토리를 다시 만들려고 시도 할 수 없다는 것입니다. Windows에서 UnauthorizedAccessException과 함께 C# 프로그램에보고 된 "액세스 거부"오류가 발생합니다.

희미한 기능인 것처럼 들리지만, 모든 Windows에서 프로그램이이를 수행합니다. 모든 프로세스에는 Environment.CurrentDirectory의 값인 기본 작업 디렉토리가 있습니다. 이러한 디렉토리에 핸들을 작성하면 프로그램이 핸들을 사용하는 동안 사라지지 않습니다. 다른 경우 FileSystemWatcher가 또 다른 예입니다. 또는 디렉토리를 반복하는 프로그램. 악성 코드 및 검색 인덱서는 이러한 오류의 출처를 진단하기가 어렵다고합니다.

그렇지 않으면 멀티 태스킹 운영 체제의 표준 위험 요소입니다. 당신은 파일 시스템을 사용하는 유일한 사람이 아닙니다. 동일한 디렉토리를 반복적으로 삭제 및 생성하지 않는 것이 귀하의 목록에서 매우 중요합니다. 이것이 절대적으로 필요한 경우 의 이름을 삭제하기 전에 먼저 이름을 변경하십시오. 아직 이름이 바뀐 디렉토리는 삭제하지 못했지만 재 작성을 실패하지는 않습니다. 다음에 필요할 때 삭제할 수 있습니다. 문제에 대한 확률이 훨씬 낮습니다. 더 많은 시간이 지났기 때문에.

관련 문제