检测Linux和Mac OS X上安装的驱动器
Detecting mounted drives on Linux and Mac OS X
我正在使用QDir::drives()
来获取驱动器列表。它在Windows上运行良好,但在Linux和Mac上只返回一个项目"/",即root。这是预期的行为,但我如何才能获得Mac和Linux上的驱动器列表?
也欢迎非-Qt本地API解决方案。
关于"驱动器"定义的澄清:我想得到一个在Finder或Linux内置文件管理器中可以作为"驱动器"查看的装载点列表。
就文件系统而言,Unix/Linux中没有驱动器的概念(我不能保证MacOSX,但我认为它是一样的)。最接近的可能是装载点,但普通应用程序不应该为它们而烦恼,因为在文件系统根目录/
下所有的装载点都已经可用(因此就是您观察到的QDir::drives()
的行为)。
如果您真的想知道哪些挂载点在使用,可以解析mount
命令的输出(不带任何参数),或者至少在Linux上解析/etc/mtab
文件的内容。不过,请注意,装载点可能会变得非常快(循环设备、FUSE文件系统、网络共享等),因此,我不建议使用它们,除非您的应用程序设计用于管理它们。
请记住,在Unix-y操作系统上,装载点通常是系统管理员的问题,而不是最终用户的问题,除非我们谈论的是可移动介质或临时网络共享。
编辑:根据注释中的说明,在Linux上,您应该使用getmntent
或getmntent_r
来解析/etc/mtab
文件的内容,从而获得所有装载点和相应设备的列表。
之后的技巧是确定要显示哪些(可移动?网络共享?)。我知道/sys/block/...
可以帮上忙,但我不知道所有的细节,所以你必须多挖一点。
例如,要检查安装在/media/usb0/
上的/dev/sdd1
(USB密钥)是否是可移动设备,可以执行以下操作(注意我如何使用设备名称sdd
,而不是分区名称sdd1
):
$ cat /sys/block/sdd/removable
1
与我的主硬盘相反:
$ cat /sys/block/sda/removable
0
希望这能让你走上正轨。
对于OS X,磁盘仲裁框架可用于列出和监视驱动器和装载点
在任何一个平台上,取消mount
shell命令的输出都是一种选择——不过,您对驱动器的定义是什么?物理介质、可移动驱动程序、网络卷?你需要做大量的过滤。
在MacOSX上,可移动介质、网络卷和辅助硬盘驱动器的装载点始终位于/Volumes/
下,因此,如果您对驱动器的定义很宽泛,那么简单地枚举该目录中的项目就可以了。这应该是相当安全的,因为它们都是自动安装的。
在Linux上,根据所使用的特定发行版,有多种位置。/mnt/
是传统的,但也有其他的。
在linux中,获取当前安装的驱动器信息的方法是解析mtab
文件。glibc提供了一个宏_PATH_MNTTAB
来定位这个文件。看见http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-信息
如果您知道有问题的驱动器的格式,您可以使用df命令从控制台输出驱动器列表,也可以通过编程将其作为系统命令输出。例如,要查找所有ext4驱动器:
df -t ext4
如果您对多种类型感兴趣,您可以简单地在同一命令中添加其他格式:
df -t ext4 -t tmpfs
这将向您返回驱动器的物理位置、内存量、已用内存量、可用内存量、使用百分比以及它在文件系统上的安装位置。
df将向您显示系统上安装的所有驱动器,但有些驱动器并不是您真正想要的,比如临时文件系统等。
不确定这是否适用于OSX,但它确实适用于我的Ubuntu 12.04发行版。
另一种方法是检查"卷"
df-H|grep"/Volumes"
我知道这是旧的,但它没有提到我最终在macos中使用的getfsstat
。您可以使用getfsstat
获得装载列表(其中包括大多数磁盘)。详见man 2 getfsstat
。
- 在Ubuntu 16.04上安装Cilk时出现问题
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- C++:如何在CLion IDE中安装Boost
- 安装opencv失败-粘贴CMakeError.log的内容
- 在cygwin中测试新的boost安装时出现cpp错误
- 有人安装"IITB Simplecpp in mac"吗?
- 我可以在 Arduino 的库文件夹之外安装库吗?
- Mingw-64 在构建和安装后不会编译 openCV 代码
- 为什么构建目录中新构建的共享库与安装目录中的副本具有不同的依赖项集?
- 在QTreeView中仅显示共享驱动器和文件夹
- 安装 libc++ 时出现问题
- 安装MinGW后C++编译器不起作用?
- 介子复制/安装头文件到输出目录并保持文件夹结构
- 无法安装 R 包 "nloptr"(Ubuntu 16.04 上的 R3.6.2) - C++编译器问题
- 如何在 Ubuntu 上安装 OpenCV for C/C++
- 如何查找Mac上是否真的存在已安装的驱动器
- 检测Linux和Mac OS X上安装的驱动器
- 列出我的计算机上安装的物理驱动器
- USB 上C++编译器(无需安装计算机(c 驱动器、PATH 等))的可移植 Eclipse CC++ 配置