如何在C#中枚举网络共享和web文件夹?
.Net为我们提供了一个FolderBrowserDialog控件来浏览文件夹。但是,这是一个模式对话框。我需要创建一个可以放到表单上的用户控件。因此,我一直在考虑创建我自己的,在那里我需要获得所有本地驱动器、映射网络驱动器、UNC共享和web文件夹(WebDAV/SharePoint)。我正在使用Windows7和.NET4.0 本地和映射网络驱动器如何在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资源管理器中,还可以看到已
我可以从DriveInfo.GetDrives()获取本地驱动器。但是,这些仅显示可用/在线的驱动器。在Windows资源管理器中,还可以看到已断开连接/不可用的映射网络驱动器 网络文件夹/UNC共享
从我目前发现的情况来看,.Net中似乎没有枚举UNC共享的机制。似乎我必须使用Win32 API的互操作来使用
WNetOpenEnum
和WNetEnumResource
函数来枚举网络邻居。我让这个工作,但不知道是否有其他的方式
Web(WebDAV)文件夹和SharePoint在Windows资源管理器中,我配置了几个WebDAV文件夹。使用上述
WNetOpenENum
和WNetENumResource
的相同互操作调用,我获得了一个节点“Web客户端网络”,并显示了已连接且可访问的WebDAV文件夹
问题
WNetEnumResource
正在向我返回一个“Microsoft终端服务”的空节点。如果不根据英文文本进行过滤,我如何过滤掉这些内容WNetEnumResource
返回的web文件夹不是我创建它们时分配给它们的用户友好名称,而是IP格式的-Address@Port,例如,\\nnn.nnn.nnn。nnn@18123
。如何获取web文件夹的用户友好名称是的,你可以做到这一点,看看这个网站,它将向你展示如何在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中有一个错误-请参阅问题