3

.Net은 폴더 탐색을위한 FolderBrowserDialog 컨트롤을 제공합니다. 그러나 이것은 모달 대화 상자입니다. 내 양식에 놓을 수있는 사용자 정의 컨트롤을 만들어야합니다. 그래서 필자는 모든 로컬 드라이브, 매핑 된 네트워크 드라이브, UNC 공유 및 웹 폴더 (WebDAV/SharePoint)를 가져와야 할 곳을 직접 만들려고했습니다. Windows 7과 .Net 4.0을 사용하고 있습니다.C#에서 네트워크 공유 및 웹 폴더를 어떻게 열거 할 수 있습니까?

로컬 및 매핑 된 네트워크
내가 DriveInfo.GetDrives에서 로컬 드라이브를 얻을 수 있습니다 드라이브(). 그러나 이것들은 나에게 사용 가능한 온라인 드라이브만을 보여줍니다. Windows 탐색기에서는 연결이 끊어져 있거나 사용할 수없는 매핑 된 네트워크 드라이브도 표시됩니다.

네트워크 폴더/UNC 공유 내가 지금까지 발견 한 것과
은 UNC 공유를 열거하는 닷넷의 메커니즘이있을 나타나지 않습니다. Inter32 to Win32 API를 사용하여 WNetOpenEnumWNetEnumResource 함수를 사용하여 네트워크 환경을 열거해야하는 것으로 보입니다. 나는이 일을하고 있지만 다른 방법이 없는지 궁금해하고 있었다. Windows 탐색기에서

웹 관리 (WebDAV) 폴더 및 SharePoint
나는 약간의 WebDAV 폴더를 구성했습니다. WNetOpenENumWNetENumResource 위의 동일한 Interop 호출을 사용하여 "웹 클라이언트 네트워크"노드가 있고 연결되어 액세스 할 수있는 WebDAV 폴더가 나타납니다.

질문

  1. 어떻게 구성되어있는 매핑 된 네트워크 드라이브를 얻을 수 있지만, 오프라인합니까?
  2. UNC 공유를 열거 할 다른 방법이 있습니까? 아니면 위의 interop 호출을 사용하여 붙어 있습니까?
  3. WNetEnumResource은 "Microsoft 터미널 서비스"의 빈 노드를 반환했습니다. 영어 텍스트를 기준으로 필터링하지 않고 어떻게이를 필터링 할 수 있습니까?
  4. WNetEnumResource에 의해 반환 된 웹 폴더는 내가 만들 때 내가 할당 한 사용자 친숙한 이름이 아니지만 IP-Address @ Port 형식으로되어 있습니다. \\[email protected]. 웹 폴더의 사용자에게 익숙한 이름을 얻으려면 어떻게해야합니까?
  5. 오프라인 상태였던 웹 폴더는 전혀 표시되지 않았지만 Windows 탐색기에서는 표시됩니다. 오프라인 상태 인 것을 얻으려는 제안?

답변

0

네이이 사이트를 살펴 할 수 그것을 당신이 VB에서 작업을 수행하는 방법을 보여줍니다뿐만 아니라 C# 여기

Enumerating Network Drives/Shares

당신이 같은 시도 할 수있는 샘플 응용 프로그램입니다 잘 codeproject에서

// 

// Enumerate shares on local computer 

// 

Console.WriteLine("\nShares on local computer:"); 
ShareCollection shi = ShareCollection.LocalShares; 
if (shi != null) 
{ 
    foreach(Share si in shi) 
    { 
     Console.WriteLine("{0}: {1} [{2}]", 
      si.ShareType, si, si.Path); 

     // If this is a file-system share, try to 

     // list the first five subfolders. 

     // NB: If the share is on a removable device, 

     // you could get "Not ready" or "Access denied" 

     // exceptions. 

     if (si.IsFileSystem) 
     { 
      try 
      { 
       System.IO.DirectoryInfo d = si.Root; 
       System.IO.DirectoryInfo[] Flds = d.GetDirectories(); 
       for (int i=0; i < Flds.Length && i < 5; i++) 
        Console.WriteLine("\t{0} - {1}", i, Flds[i].FullName); 

       Console.WriteLine(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("\tError listing {0}:\n\t{1}\n", 
        si, ex.Message); 
      } 
     } 
    } 
} 
else 
    Console.WriteLine("Unable to enumerate the local shares."); 

// 

// Resolve local paths to UNC paths. 

// 

Console.WriteLine("{0} = {1}", 
    fileName, ShareCollection.PathToUnc(fileName)); 
+1

흥미롭게도 로컬로 정의 된 공유에 액세스하는 데 적합합니다. 내가 관심을 갖는 것은 \\ OtherComputer \ SomeShare와 같이 네트워크상의 다른 컴퓨터에 정의 된 공유이다. – Elan

+0

WMI에 익숙하십니까 ..? 관심이있는 경우 다른 원격 시스템을 쿼리하는 방법에 대한 샘플을 보내 드리겠습니다. – MethodMan

+0

예, 제가 가고 싶은 곳으로 가는데 도움이된다면 해주세요. :) – Elan