【问题标题】:How can I enumerate network shares and web folders in C#?如何在 C# 中枚举网络共享和 Web 文件夹?
【发布时间】:2012-01-18 22:29:08
【问题描述】:

.Net 为我们提供了一个 FolderBrowserDialog 控件来浏览文件夹。然而,这是一个模态对话框。我需要创建一个可以放到表单上的用户控件。因此,我一直在考虑创建自己的,我需要在其中获取所有本地驱动器、映射的网络驱动器、UNC 共享和 Web 文件夹 (WebDAV/SharePoint)。我正在使用 Windows 7 和 .Net 4.0。

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

网络文件夹/UNC 共享
从我目前发现的情况来看,.Net 中似乎没有一种机制来枚举 UNC 共享。看来我必须使用 Interop to Win32 API 才能使用 WNetOpenEnum 和 WNetEnumResource 函数来枚举网络邻居。我得到了这个工作,但想知道是否没有其他方法。

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

问题

  1. 如何获取已配置但离线的映射网络驱动器?
  2. 还有其他方法可以枚举 UNC 共享,还是我坚持使用上述命名的互操作调用?
  3. WNetEnumResource 向我返回了“Microsoft 终端服务”的空节点。如何在不根据英文文本过滤的情况下将其过滤掉?
  4. WNetEnumResource 返回的 web 文件夹不是我创建它们时分配给它们的用户友好名称,而是采用 IP-Address@Port 格式,例如\\nnn.nnn.nnn.nnn@18123。如何获取 Web 文件夹的用户友好名称?
  5. 脱机的网络文件夹根本没有出现,但在 Windows 资源管理器中却出现了。关于获取那些离线的有什么建议吗?

【问题讨论】:

    标签: c# network-share shared-directory web-folders filesystem-browser


    【解决方案1】:

    是的,你可以这样做,看看这个网站,它会告诉你如何在 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));
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多