我正在使用QDir::drives()
来获取驱动器列表。它在Windows上运行良好,但在Linux和Mac上它只返回单个项目“/”,i。即根。这是预期的行为,但我怎样才能获得Mac和Linux上的驱动器列表?
非Qt原生API解决方案也欢迎。
对“驱动器”定义的澄清:我想获得一个在Finder或Linux内置文件管理器中作为“驱动器”可见的挂载点列表。
答案 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
。