枚举断开连接的网络驱动器 - NTFS驱动器格式

时间:2012-12-06 16:06:11

标签: c# mapped-drive driveinfo

我遇到了这篇优秀的文章,它解决了在C#中枚举断开连接的驱动器的问题: Mapped network drives cannot be listed in C#

问题是这个代码似乎不包含NTFS格式的驱动器(只有FAT)

由于我不是C ++ / WinAPI技术人员,我发现很难修复代码(如果可能的话)。 有没有人有机会对它进行调查并解决它,或者至少给我一个提示?

谢谢! 布丝

2 个答案:

答案 0 :(得分:2)

好的,我有一个答案。它与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,                     资源,出ptrHandle);

谢谢!

答案 1 :(得分:1)

如果要列出本地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);
        }
    }

希望有所帮助。