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

时间:2012-01-18 22:29:09

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

.Net为我们提供了一个FolderBrowserDialog控件来浏览文件夹。但这是一个模态对话框。我需要创建一个用户控件,我可以将其放到我的表单上。所以,我一直在寻找创建自己的,我需要获取所有本地驱动器,映射网络驱动器,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股票,还是我坚持使用上面提到的互操作电话?
  3. WNetEnumResource向我返回“Microsoft终端服务”的空节点。如何在不根据英文文本进行过滤的情况下对其进行过滤?
  4. WNetEnumResource返回的网络文件夹不是我创建它时分配给他们的用户友好名称,但是格式为IP-Address @ Port,例如\\nnn.nnn.nnn.nnn@18123。如何获取Web文件夹的用户友好名称?
  5. 离线的网络文件夹根本没有出现,但在Windows资源管理器中却出现了这些文件夹。有关获取离线的建议吗?

1 个答案:

答案 0 :(得分: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));