문제

사용자 정의 설치 프로그램 작업을 추가 한 .NET 설정 프로젝트가 있습니다. 설정 프로세스 중에 사용자는 파일 서버의 공유에 대한 경로 (종종 UNC 경로)를 제공해야합니다. 디렉토리가 존재하는지 확인하기 전에 검증을 시도합니다.

if (!Directory.Exists(serverDirectory)) { 
    throw new InstallException("Specified path does not exist or ..."); 
} 

예쁜 바닐라 - 그리고 콘솔 앱에서 directory.exists () 코드는 예상대로 작동합니다. 그러나 MSI의 맥락에서는 그렇지 않습니다. 구체적으로, 전화 directory.exists 네트워크 리소스를 사용할 때는 항상 실패합니다. 문서 directory.exists 표시합니다 :

존재하는 메소드는 네트워크 인증을 수행하지 않습니다. 사전 승인되지 않고 기존 네트워크 공유를 쿼리하면 ExistS 메소드가 False를 반환합니다.

검색으로 인해 ASP.NET의 다른 유사한 시나리오가 있는데,이 시나리오는 사칭이 해결책입니다. 여기에는 적용 할 수 없지만 문제를 보여줍니다.

네트워크 경로의 존재를 어떻게 확인할 수 있습니까? 문서의 언어를 넣으려면 전화 전에 어떻게 사전 승인합니까? 사용자는 관리자로 설치하고 있으며 Windows Explorer의 해당 경로를 탐색하는 것이 성공적으로 작동하므로 사용자의 권한이 아니라 코드의 확인이 부족합니다.

불필요한 관심사를 만들었습니까? 네트워크 리소스를 사용할 때 이것을 생략하고 나중에 예외를 던져야합니다 ... 그것은 크게 비판적인 실패입니다.

도움이 되었습니까?

해결책

그것은 단지 존재가 아닙니다. 당신은 또한 권한을 확인해야하며, 확인시기와 실제로 값을 사용할 때 사이의 기간에 변경 될 때 어떤 일이 발생하는지 걱정해야합니다.

따라서 정상적인 메커니즘은 모든 것이 괜찮다고 가정하는 것입니다. 대신, 가정이 거짓으로 판명 될 때 예외를 처리하는 데 개발 노력을 기울여야합니다.

이 경우 해당 디렉토리에 작은 자리 표시 자 파일을 즉시 작성하고 폴더가 완전히 완료 될 때까지 해당 파일의 잠금 장치를 보유하여이를 향상시킬 수 있습니다. 파일을 만들려고 즉각적인 오류가 발생하기 때문에 더 나은 피드백을 제공 할 수 있습니다. 또한 폴더를 보장하는 데 도움이됩니다 머물러 있습니다 액세스 가능, Windows에서는 최소한 사용자가 해당 파일에 잠금을 고정하는 한 폴더를 삭제하거나 크게 변경하는 데 어려움을 겪게됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top