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

如何在C#中枚举网络共享和web文件夹?,c#,network-share,shared-directory,web-folders,filesystem-browser,C#,Network Share,Shared Directory,Web Folders,Filesystem Browser,.Net为我们提供了一个FolderBrowserDialog控件来浏览文件夹。但是,这是一个模式对话框。我需要创建一个可以放到表单上的用户控件。因此,我一直在考虑创建我自己的,在那里我需要获得所有本地驱动器、映射网络驱动器、UNC共享和web文件夹(WebDAV/SharePoint)。我正在使用Windows7和.NET4.0 本地和映射网络驱动器 我可以从DriveInfo.GetDrives()获取本地驱动器。但是,这些仅显示可用/在线的驱动器。在Windows资源管理器中,还可以看到已

.Net为我们提供了一个FolderBrowserDialog控件来浏览文件夹。但是,这是一个模式对话框。我需要创建一个可以放到表单上的用户控件。因此,我一直在考虑创建我自己的,在那里我需要获得所有本地驱动器、映射网络驱动器、UNC共享和web文件夹(WebDAV/SharePoint)。我正在使用Windows7和.NET4.0

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

网络文件夹/UNC共享
从我目前发现的情况来看,.Net中似乎没有枚举UNC共享的机制。似乎我必须使用Win32 API的互操作来使用
WNetOpenEnum
WNetEnumResource
函数来枚举网络邻居。我让这个工作,但不知道是否有其他的方式

Web(WebDAV)文件夹和SharePoint
在Windows资源管理器中,我配置了几个WebDAV文件夹。使用上述
WNetOpenENum
WNetENumResource
的相同互操作调用,我获得了一个节点“Web客户端网络”,并显示了已连接且可访问的WebDAV文件夹

问题

  • 如何获取已配置但处于脱机状态的映射网络驱动器
  • 有没有其他方法来枚举UNC共享,或者我一直在使用上面提到的互操作调用
  • WNetEnumResource
    正在向我返回一个“Microsoft终端服务”的空节点。如果不根据英文文本进行过滤,我如何过滤掉这些内容
  • WNetEnumResource
    返回的web文件夹不是我创建它们时分配给它们的用户友好名称,而是IP格式的-Address@Port,例如,
    \\nnn.nnn.nnn。nnn@18123
    。如何获取web文件夹的用户友好名称
  • 脱机的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));
    
    //
    //枚举本地计算机上的共享
    //
    Console.WriteLine(\n本地计算机上的存储:);
    ShareCollection shi=ShareCollection.LocalShares;
    if(shi!=null)
    {
    foreach(在shi中共享si)
    {
    Console.WriteLine(“{0}:{1}[{2}]”,
    si.ShareType,si,si.Path);
    //如果这是文件系统共享,请尝试
    //列出前五个子文件夹。
    //注意:如果共享在可移动设备上,
    //您可能会遇到“未准备好”或“访问被拒绝”
    //例外情况。
    if(si.IsFileSystem)
    {
    尝试
    {
    System.IO.DirectoryInfo d=si.Root;
    System.IO.DirectoryInfo[]Flds=d.GetDirectories();
    对于(int i=0;i
    很有趣,并且可以很好地访问本地定义的共享。我感兴趣的是网络上其他计算机上定义的共享,如\\OtherComputer\SomeShare。您熟悉WMI吗。。?如果你是一个有趣的人,我会给你一个如何查询其他远程机器的例子,如果你能帮我找到我想去的地方,请做我的工作。)我在路上,有一些链接可以帮助你…您从注意中获得Shares.cs:Shares.cs中有一个错误-请参阅问题