2010-02-08 2 views
8

원격 디렉터리를 만들고 파일을 쓰려고합니다. 가끔씩은 파일을 쓰려고 할 때 응용 프로그램이 System.IO.DirectoryNotFoundException으로 실패합니다.Directory.CreateDirectory 지연 문제?

파일을 쓸 때 반환 된 DirectoryInfo 개체를 사용하여 파일 경로를 만드는 데 도움이되므로 응용 프로그램에서 해당 디렉터리가 생성되었다고 생각하는 것 같습니다. 그러나 디렉터리가 존재하지 않습니다.

Windows에서 파일을 작성하기 전에 디렉토리에 쓰려고 할 가능성이 있습니까? 나는이 작업이 끝날 때까지 Directory.CreateDirectory가 반환되지 않을 것이라고 생각합니다.

+0

나는 좋은 대답이 없지만 "원격"이 무엇인지 반드시 말하지는 않습니다. 아마 원격 서버가 로컬 파일 시스템에 폴더를 만들었지 만 브라우징 할 때 아직 그것을 돌려 보내지 않은 경우 일 수 있습니다. 어쩌면 캐싱 문제 (실제로 파일 시스템 구조를 캐시 할 수 있을까요?). –

+0

원격 서버가 Windows 서버입니까, 아니면 Samba를 실행하는 다른 유형의 서버입니까? – Jacob

+0

AS400에서 IFS 공유입니다. 응용 프로그램은 UNC 경로로 IFS 공유에 액세스하는 Windows 상자에서 실행됩니다. – majorpayne27

답변

7

답변 - 예. 파일/디렉토리 생성이 뒤처 질 때의 동작입니다. 다른 주석 기자가 제안한 일반적인 해결책은 재시도를 약간의 시간 초과로 사용하는 것입니다. 이 동작은 Findfirst, CreateFile, WaitForSingleObject 등의 파일 함수가 사용하는 것과 동일합니다.

또 다른 해결책은 Vista 이상의 Windows 운영 체제에서 발견 된 API의 새로운 트랜잭션 기능을 사용하는 것입니다.

DOS/CMD 스크립트, SVN 클라이언트, Cygwin, perl, 다양한 Java 응용 프로그램, 다양한 설치 프로그램 등의 파일 집약적 프로젝트를 다른 플랫폼에서 Windows로 옮기는 개발자는이 문제를 이해하지 못했습니다.

+1

+1 우리는 항상 NAS 설정에 맞춰진 IO 호출 라이브러리를 가지고 있습니다. –

+0

누군가 그 다른 마법의 방법을 알고 있습니까? – Mrchief

4

이 동작을 전혀 경험하지 못했지만 설명 할 수 없지만 실용적인 해결 방법은 디렉터리에 액세스하는 호출 주위에 루프를 설정하는 것입니다. 해당 루프 내에서 DirectoryNotFoundException을 catch하고 매번 잠깐 멈춘 후에 몇 번 액세스를 다시 시도하십시오. 재시도 횟수를 초과하면 예외를 다시 발생시킵니다.

이 시점에서 상세 로깅을 추가하면 실제 문제의 원인을 파악하는 데 도움이 될 수 있습니다.

+0

'Directory.Exists()'를 확인하는 것은 예외를 잡는 것보다 오히려 더 효율적일 수 있습니다. –

+0

@CoryCharlton : 더 효율적인 방법은 무엇입니까? 파일 시스템을 검사하는 것은 예외를 던지고 검사하는 것보다 훨씬 더 심각하며, 어쨌든 파일 시스템은 Directory.Exists()를 수행합니다. – Arafangion

6

난 그냥이 문제를 가지고 나를 위해 상황이 같았다 :

,369 :에 전달이 같은의 DirectoryInfo 개체가 다른 클래스에서 내가 할 때

if(!exportDirectory.Exists) 
    exportDirectory.Create(); 

그런 다음 나중에

if (!exportDirectory.Exists) 
    throw new DirectoryNotFoundException(exportDirectory.FullName); 

그리고 디렉토리가 분명히 존재하지 않습니다 (물론 부모 디렉토리가 열려 있고 물론 내 앞에서 볼 수 있습니다).

내가 찾은 해결책은 내가 호출 할 디렉토리의 초기 생성 이후 : Microsoft에서

exportDirectory.Refresh(); 

:

는 개체의 상태를 새로 고칩니다. (FileSystemInfo에서 상 속됨)