3

I’m using QDir::drives() to get the list of drives. It works great on Windows, but on Linux and Mac it only returns a single item “/”, i. e. root. It is expected behavior, but how can I get a list of drives on Mac and Linux?

Non-Qt, native API solutions are also welcome.

Clarification on "drive" definition: I'd like to get a list of mount points that are visble as "drives" in Finder or Linux built-in file manager.

4

7 回答 7

5

对于 OS X,磁盘仲裁框架可用于列出和监控驱动器和挂载点

于 2013-09-25T18:13:28.337 回答
5

就文件系统而言,Unix/Linux 中没有驱动器的概念(我不能保证 MacOSX,但我会说它是一样的)。最接近的可能是挂载点,但普通应用程序不应该打扰它们,因为所有这些都已经在文件系统根目录下可用/(因此QDir::drives()您观察到的行为)。

如果您真的想查看正在使用的挂载点,您可以解析mount命令的输出(不带任何参数),或者至少在 Linux 上解析/etc/mtab文件的内容。但请注意,挂载点可能会很快变得非常麻烦(循环设备、FUSE 文件系统、网络共享等),所以我不建议您使用它们,除非您的应用程序旨在管理它们。

请记住,在 Unix-y 操作系统上,挂载点通常是系统管理员的事情,而不是最终用户,除非我们说的是可移动媒体或临时网络共享。


编辑:根据您在评论中的说明,在 Linux 上,您应该使用getmntentgetmntent_r解析/etc/mtab文件的内容,从而获得所有挂载点和相应设备的列表。

之后的技巧是确定要显示哪些(可移动?网络共享?)。我知道这/sys/block/...可以帮助解决这个问题,但我不知道所有细节,所以你必须多挖一点。

例如,要检查/dev/sdd1安装的(USB 密钥)是否/media/usb0/是可移动设备,您可以这样做(注意我如何使用设备名称sdd,而不是分区名称sdd1):

$ cat /sys/block/sdd/removable
1

与我的主硬盘相反:

$ cat /sys/block/sda/removable
0

希望这能让你走上正确的道路。

于 2013-09-03T20:01:59.143 回答
1

In linux, the way to get information about drives currently mounted is to parse the mtab file. glibc provides a macro _PATH_MNTTAB to locate this file. See http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-Information

于 2013-09-03T20:09:12.420 回答
1

如果您知道相关驱动器的格式,您可以使用 df 命令从控制台输出驱动器列表或以编程方式作为系统命令输出。例如,要查找所有 ext4 驱动器:

df -t ext4

如果您对不止一种类型感兴趣,您可以简单地将其他格式添加到同一命令中:

df -t ext4 -t tmpfs

这将向您返回驱动器的物理位置、它拥有的内存量、使用的内存量、可用内存量、使用百分比以及它在文件系统上的安装位置。

df 将向您显示系统上安装的所有驱动器,但有些将不是您真正需要的东西,例如临时文件系统等。

不确定这是否适用于 OSX,但它确实适用于我的 Ubuntu 12.04 发行版。

于 2013-09-03T20:43:05.370 回答
1

刮掉 shell 命令的输出mount肯定是任一平台上的一种选择——不过,您在这里对驱动器的定义是什么?物理媒体、可移动驱动程序、网络卷?您需要进行大量过滤。

在 MacOSX 上,可移动媒体、网络卷和辅助硬盘驱动器的挂载点始终位于 下/Volumes/,因此如果您对驱动器的定义很广泛,只需枚举此目录中的项目即可。这应该是相当安全的,因为它们都是 automounted 。

在 Linux 上,根据使用的特定发行版,有多种位置。 /mnt/是传统的,但还有其他的。

于 2013-09-03T20:04:01.377 回答
1

我知道这是旧的,但它没有提到getfsstat我最终在 macos 中使用的。您可以使用getfsstat. 请参阅man 2 getfsstat以获取更多信息。

于 2018-10-28T13:27:54.560 回答
1

另一种方法是检查“卷”

df -H | grep "/卷"

于 2016-07-07T06:45:33.267 回答