문제

삼바 마운트에서 일부 리소스를 사용하려는 웹 응용 프로그램이 있습니다. 마운트가 어떻게 든 실패한 경우, 오류를 신속하게 감지하고보고하는 방법이 필요하지만, File.Exists 및 Directory.Exists는 마운트가 사라질 때 허위를 반환하는 데 30 초가 걸립니다. C#에서 마운트를 사용할 수 있는지 신속하게 판단하는 가장 좋은 방법은 무엇입니까?

도움이 되었습니까?

해결책

Win32 Windows 네트워킹 기능은이 정보를 얻는 유일한 방법입니다. 당신은 어느 쪽이든 사용할 수 있어야합니다 wnetgetResourceInformation 또는 WnetgetConnection. WnetGetConnection이 최선의 선택이라고 생각합니다. 가장 관심이있는 반환 값은 다음과 같습니다.

ERROR_CONNECTION_UNAVAIL 장치는 현재 연결되어 있지 않지만 지속적인 연결입니다. 자세한 내용은 다음 정보 섹션을 참조하십시오.

ERROR_NO_NETWORK 네트워크를 사용할 수 없습니다.

그 모든 것을 제외하고, 나는 백업 위치에서 읽거나 쓸 수있게되기를 간절히 원한다는 것을 이해하지만, 응용 프로그램이 아닌 하드웨어 및/또는 운영 체제 측면에서 더 적절하게 처리되는 것처럼 보입니다. 하드웨어 및/또는 운영 체제는 읽기/쓰기 실패 또는 다른 네트워크 관련 이벤트가 발생했음을 감지하고 적절한 조치를 취할 가능성이 훨씬 높습니다.

다른 팁

File.exists를 성공적으로 확인하면 항상 5 초 (또는 짧은 시간) 이내에 완료되면 그보다 더 오래 걸리는 전화가 실패한다고 가정 할 수 있습니다.

의사 코드 가능한 솔루션은 다음과 같습니다.

const int CUSTOM_TIMEOUT = 5;
bool isMountedVar = false;

bool isMounted ( string path) {
   Thread mythread = executeNewThread(&isMountedThread, path);
   sleep(CUSTOM_TIMEOUT);
   if( mythread.finished() )
      return isMountedVar;
   // Otherwise
   mythread.kill();
   return false;
}

void isMountedThread(string path) {
   isMountedVar = File(path).Exists;
}

이 문제는 기본 운영 체제 (Windows)가 공유가 없다는 사실을 반환하는 데 걸리는 것입니다.

내 머리 꼭대기에서 생각할 수있는 가장 빠른 방법은 원격 장치로부터 응답을 얻는 지 확인하기 위해 핑을 시작하는 것입니다. 핑이 성공적이면 (1 초 안에 검증 될 수 있어야 함) 이론적으로 얻어야합니다. 마운트에서 다시 응답이 합리적으로 빠르게 응답합니다. 원격 장치를 사용할 수 없으면 상대적으로 빠르게 어떤 종류의 아이디어가있을 것입니다. 그것 ~이다 더럽지만 Windows Check가 타임 아웃을 기다리는 것보다 더 빠른 결과를 제공합니다.

물론 원격 장치에서 공유의 가용성을 확인하지는 않습니다. 원격 서버에서 소프트웨어를 실행할 수 있습니까? 그렇다면 공유 이름으로 핑을 할 수있는 공유 가용성을 확인할 수있는 센티넬을 쓸 수 있습니다. 그런 다음 시간 초과 할 필요가 없기 때문에 이론적으로 훨씬 더 빨리 응답 할 것입니다. Sentinel은 True 또는 False로 응답하거나 즉시 응답하지 못할 것입니다. 어쨌든 빠른 답변이 있습니다.

그게 지금은 ... 아마도 곧 더 많은 생각을 할 것입니다.

나는 조사하는 것이 좋습니다 WIN32 Windows 네트워킹 기능, 이 기능은 직접 액세스 할 수 없기 때문에 .NET. 아마도 출발점은 WNetGetResourceInformation 기능, 오류가 발생하여 반환 코드입니다.

WNetGetResourceInformation

네트워크 리소스에 대한 원격 경로가 제공되면 WNETGETRESOURCEINFORFORMATION 기능은 리소스를 소유하고 리소스 유형에 대한 정보를 얻는 네트워크 제공 업체를 식별합니다. 함수가 실패하면 반환 값은 다음 값 중 하나와 같은 시스템 오류 코드입니다.

반환 코드 - 설명

ERROR_BAD_NET_NAME- 입력 lpremoteName 멤버는 모든 네트워크의 기존 네트워크 리소스가 아닙니다.

ERROR_BAD_DEV_TYPE- 입력 DWTYPE 멤버는 LPREMOTENAME 멤버가 지정한 리소스 유형과 일치하지 않습니다.

error_extended_error- 네트워크 별 오류가 발생했습니다. 오류에 대한 설명을 얻으려면 wnetgetLasterror에 전화하십시오.

ERROR_MORE_DATA- LPBUFFER 매개 변수가 가리키는 버퍼가 너무 작습니다.

ERROR_NO_NETWORK- 네트워크를 사용할 수 없습니다.

전화하기 위해 Wnet 기능 .NET, 예제를 검색하십시오 pinvoke.net. 빠른 검색은 a를 내놓지 않았습니다 WNetGetResourceInformation 예를 들어, 다른 사람에게 충분한 전화가 있습니다 Wnet 기능. 보다 WnetAddConnection2 비슷한 용도로.

그만큼 WNetAddConnection2 함수는 네트워크 리소스에 연결됩니다. 이 기능은 로컬 장치를 네트워크 리소스로 리디렉션 할 수 있습니다.

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