如何在C#中枚举网络共享和Web文件夹?

.Net为我们提供了一个FolderBrowserDialog控件来浏览文件夹。 但这是一个modal dialog。 我需要创建一个用户控件,我可以将其放到我的表单上。 所以,我一直在寻找创建自己的,我需要获取所有本地驱动器,映射网络驱动器,UNC共享和Web文件夹(WebDAV / SharePoint)。 我使用的是Windows 7和.Net 4.0。

本地和映射网络驱动器
我可以从DriveInfo.GetDrives()获取本地驱动器。 但是,这些仅显示可用/在线的驱动器。 在Windows资源管理器中,您还可以看到已断开/不可用的映射网络驱动器。

网络文件夹/ UNC股票
从我到目前为止发现的情况来看,.Net中似乎没有一个机制来枚举UNC的股票。 似乎我必须使用Interop到Win32 API来使用WNetOpenEnumWNetEnumResource函数来枚举网络邻域。 我有这个工作,但想知道是否没有其他办法。

Web(WebDAV)文件夹和SharePoint
在Windows资源管理器中,我配置了一些WebDAV文件夹。 在WNetOpenENumWNetENumResource之上使用相同的Interop调用我得到了一个节点“Web客户端网络”,并且出现了连接和访问的WebDAV文件夹。

问题

  1. 如何获取已配置但已脱机的映射网络驱动器?
  2. 有没有其他方法来枚举UNC股票,还是我坚持使用上面提到的interop调用?
  3. WNetEnumResource返回给我一个“Microsoft终端服务”的空节点。 如何在不根据英文文本过滤的情况下对其进行过滤?
  4. WNetEnumResource返回的Web文件夹不是我在创建它们时分配给它们的用户友好名称,而是采用IP-Address @ Port的格式,例如\\nnn.nnn.nnn.nnn@18123 。 如何获取Web文件夹的用户友好名称?
  5. 脱机的Web文件夹根本没有出现,但在Windows资源管理器中却出现了这些文件夹。 有关获取离线的建议吗?

是的,你可以这样看看这个网站,它会告诉你如何在VB和C#中做到这一点

枚举网络驱动器/共享

这是一个示例应用程序,您可以尝试从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));