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

Vio*_*ffe 3 c++ linux macos qt disk

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

非Qt原生API解决方案也受到欢迎.

关于"驱动器"定义的澄清:我想得到一个在Finder或Linux内置文件管理器中作为"驱动器"可见的挂载点列表.

sya*_*yam 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
Run Code Online (Sandbox Code Playgroud)

与我的主硬盘相反:

$ cat /sys/block/sda/removable
0
Run Code Online (Sandbox Code Playgroud)

希望这能让你走上正轨.


小智 5

对于OS X,可以使用磁盘仲裁框架来列出和监视驱动器以及安装点