在Linux和Mac OS X上检测已安装的驱动器

时间:2013-09-03 19:51:03

标签: c++ linux macos qt disk

我正在使用QDir::drives()来获取驱动器列表。它在Windows上运行良好,但在Linux和Mac上它只返回单个项目“/”,i。即根。这是预期的行为,但我怎样才能获得Mac和Linux上的驱动器列表?

非Qt原生API解决方案也欢迎。

对“驱动器”定义的澄清:我想获得一个在Finder或Linux内置文件管理器中作为“驱动器”可见的挂载点列表。

7 个答案:

答案 0 :(得分:5)

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

如果你真的想看看正在使用哪个挂载点,你可以解析mount命令的输出(没有任何参数),或者至少在Linux上解析/etc/mtab的内容文件。但要注意,挂载点可以快速实现(循环设备,FUSE文件系统,网络共享......),所以,除非您的应用程序旨在管理它们,否则我不建议使用它们。

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


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

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

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

$ cat /sys/block/sdd/removable
1

与我的主硬盘相反:

$ cat /sys/block/sda/removable
0

希望这能让你走上正轨。

答案 1 :(得分:4)

对于OS X,Disk Arbitration framework可用于列出和监控驱动器和挂载点

答案 2 :(得分:1)

刮除mount shell命令的输出肯定是两个平台上的一个选项 - 尽管,你在这里对驱动器的定义是什么?物理媒体,可移动驱动程序,网络卷?你需要做很多过滤。

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

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

答案 3 :(得分:1)

在linux中,获取当前挂载的驱动器信息的方法是解析mtab文件。 glibc提供了一个宏_PATH_MNTTAB来定位这个文件。见http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-Information

答案 4 :(得分:1)

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

df -t ext4

如果您对多种类型感兴趣,可以在同一命令中添加其他格式:

df -t ext4 -t tmpfs

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

df将向您显示系统上安装的所有驱动器,但有些驱动器将是您正在寻找的不像临时文件系统等的东西。

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

答案 5 :(得分:1)

另一种方法是检查"卷"

df -H | grep" / Volumes"

答案 6 :(得分:1)

我知道它很旧,但是没有提到getfsstat,我最终在macOS中使用了它。您可以使用getfsstat获取安装列表(将包括大多数磁盘)。有关更多信息,请参见man 2 getfsstat