我偶然发现了这篇解决在 C# 中枚举断开连接的驱动器问题的优秀文章: 映射的网络驱动器不能在 C# 中列出
问题是这段代码似乎不包括 NTFS 格式的驱动器(仅 FAT)
由于我不是 C++/WinAPI 技术人员,我发现很难修复代码(如果可能的话)。有没有人已经调查并解决了它,或者至少给我一个提示?
谢谢!布西
我偶然发现了这篇解决在 C# 中枚举断开连接的驱动器问题的优秀文章: 映射的网络驱动器不能在 C# 中列出
问题是这段代码似乎不包括 NTFS 格式的驱动器(仅 FAT)
由于我不是 C++/WinAPI 技术人员,我发现很难修复代码(如果可能的话)。有没有人已经调查并解决了它,或者至少给我一个提示?
谢谢!布西
好的,我有一个答案。它与 NTFS 和 FAT 无关。
这是我用来枚举驱动器的代码:
WNetOpenEnum(RESOURCE_SCOPE.RESOURCE_REMEMBERED, RESOURCE_TYPE.RESOURCETYPE_DISK, 0, resource, out ptrHandle);
请注意第一个参数 RESOURCE_SCOPE.RESOURCE_REMEMBERED。这意味着该方法将仅枚举设置为 PERSISTED 的那些映射驱动器(这意味着,在登录时重新连接)。
例如,如果我将参数更改为 RESOURCE_SCOPE.RESOURCE_CONNECTED,它将枚举非持久驱动器(如果它们已连接)。
如果你想要所有的组合,你可以这样做: WNetOpenEnum(RESOURCE_SCOPE.RESOURCE_REMEMBERED | RESOURCE_SCOPE.RESOURCE_RECENT | RESOURCE_SCOPE.RESOURCE_CONNECTED, RESOURCE_TYPE.RESOURCETYPE_DISK, 0, resource, out ptrHandle);
谢谢!
如果您想列出您的本地 NTFS 驱动器,您提到的文章不会删除它:它使用的 Win32 函数旨在枚举网络资源。
因此,如果要列出所有本地驱动器和网络驱动器,则必须同时使用链接中的代码,并从 System.IO 命名空间调用 DriveInfo.GetDrives()(或 Environment.GetDrives())。
但是,由于 GetDrives() 也会返回连接的网络驱动器,因此您需要合并两个列表的结果以避免重复:
static void Main(string[] args)
{
List<string> drives = new List<string>();
// Assuming you put the API calls in Class1
foreach (var item in Class1.WNetResource())
{
// WNetResource returns the drive letters without a trailing slash
drives.Add(String.Concat(item.Key, @"\"));
}
foreach (var item in Environment.GetLogicalDrives())
{
if (!drives.Contains(item))
drives.Add(item);
}
drives.Sort();
foreach (var drive in drives)
{
Console.WriteLine(drive);
}
}
希望有帮助。