【问题标题】:Enumerating disconnected network drives - NTFS drive formats枚举断开连接的网络驱动器 - NTFS 驱动器格式
【发布时间】:2012-11-24 17:17:03
【问题描述】:

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

问题是这段代码似乎不包括 NTFS 格式的驱动器(仅 FAT)

由于我不是 C++/WinAPI 技术人员,我发现很难修复代码(如果可能的话)。 有没有人已经研究并解决了它,或者至少给我一个提示?

谢谢! 商务

【问题讨论】:

  • 我不确定你的意思:网络共享是网络共享,仅此而已,它通过 SMB 协议抽象底层文件系统(例如,您可以使用 SMB 从 Windows 访问 ext2 驱动器) .我还尝试从我的工作站运行该代码(我安装的所有驱动器都是 NTFS),它工作正常。还是您的意思是您的本地驱动器?
  • 嗨@t-fabre,感谢您的评论。我的意思是网络驱动器而不是本地驱动器。在 Windows server 2008 R2 上运行时,我有 2 个网络驱动器 O (NTFS) 和 I (FAT),上面的代码只返回 I 驱动器
  • 奇数。刚刚测试了我发布的 2008R2 的代码,返回所有本地驱动器和映射的网络驱动器。 FS类型应该无关紧要。共享是在同一台服务器上还是在另一台服务器上?
  • 感谢@T.Fabre,请在下面查看我的回答。我错了,它与 FAT/NTFS 无关。

标签: c# mapped-drive driveinfo


【解决方案1】:

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

谢谢!

【讨论】:

  • 注意最后一个例子是错误的。引用 MSDN 上的当前文档:Scope of the enumeration. This parameter can be one of the following values.。您无法组合 dwScope 的值,如果您查看该参数的实际值,这一点就会变得很明显。
【解决方案2】:

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

希望对您有所帮助。

【讨论】:

  • 谢谢@t-fabre,恐怕这还不够。 GetDrives 不会枚举断开连接的驱动器。这就是为什么我想更新 WNetResource 代码以同时返回 NTFS 驱动器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-18
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2018-09-20
相关资源
最近更新 更多