你如何在 linux 上的 c++ 中获得所有硬盘驱动器、USB 驱动器等的列表?

问题描述

我正在编写一个自定义文件树小部件,需要显示所有当前连接的存储设备。使用 win32 api,这很容易,因为我可以使用文件 api 的 FindNextVolumeW 迭代所有卷。但是,在 linux 上,这似乎要复杂得多,因为您可以在任何给定路径上挂载任何内容。但是,至少应该有一种方法可以获取所有存储设备(尽管我猜没有 CD/软盘驱动器,因为物理驱动器上的分区必须安装在另一个存储设备上的某个位置),因为文件管理器能够显示它们在他们的菜单中。

我尝试从 /proc/mounts 读取所有当前挂载,但即使仅过滤 /dev/[sdX][nvme] 设备后,我仍然留下非存储设备,如 /boot/efi、循环设备和一些其他东西。

第二次尝试读取/etc/fstab,但由于只有手动挂载在自定义路径和主分区的设备,它没有提供所有当前连接的存储设备(例如闪存)的完整列表驱动器完全丢失)。

第三次尝试是读取/dev/disk/by-id,但我不太确定如何过滤实际使用的分区,它似乎甚至有重复。 我目前有 2 个 nvme m.2 驱动器、一个 sata 硬盘驱动器和一个 USB 闪存驱动器连接,每个都有一个“真实”分区,除了 nvme 驱动器上 Windows 或 linux 需要的正常系统保留分区。这是文件夹的内容

drwxr-xr-x 2 root root 480 Jan 27 23:19 .
drwxr-xr-x 8 root root 160 Jan 27 11:40 ..
lrwxrwxrwx 1 root root   9 Jan 27 11:40 ata-ST1500DL003-9VT16L_5YD5PM99 -> ../../sda
lrwxrwxrwx 1 root root  10 Jan 27 11:40 ata-ST1500DL003-9VT16L_5YD5PM99-part1 -> ../../sda1
lrwxrwxrwx 1 root root  13 Jan 27 11:40 nvme-eui.0025385271b0ce2b -> ../../nvme1n1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-eui.0025385271b0ce2b-part1 -> ../../nvme1n1p1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-eui.0025385271b0ce2b-part2 -> ../../nvme1n1p2
lrwxrwxrwx 1 root root  13 Jan 27 11:40 nvme-eui.002538bc01b07e00 -> ../../nvme0n1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-eui.002538bc01b07e00-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-eui.002538bc01b07e00-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-eui.002538bc01b07e00-part3 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-eui.002538bc01b07e00-part4 -> ../../nvme0n1p4
lrwxrwxrwx 1 root root  13 Jan 27 11:40 nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0J217275R -> ../../nvme1n1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0J217275R-part1 -> ../../nvme1n1p1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-Samsung_SSD_960_EVO_500GB_S3EUNX0J217275R-part2 -> ../../nvme1n1p2
lrwxrwxrwx 1 root root  13 Jan 27 11:40 nvme-Samsung_SSD_980_PRO_1TB_S5GXNF0NC26238D -> ../../nvme0n1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-Samsung_SSD_980_PRO_1TB_S5GXNF0NC26238D-part1 -> ../../nvme0n1p1
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-Samsung_SSD_980_PRO_1TB_S5GXNF0NC26238D-part2 -> ../../nvme0n1p2
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-Samsung_SSD_980_PRO_1TB_S5GXNF0NC26238D-part3 -> ../../nvme0n1p3
lrwxrwxrwx 1 root root  15 Jan 27 11:40 nvme-Samsung_SSD_980_PRO_1TB_S5GXNF0NC26238D-part4 -> ../../nvme0n1p4
lrwxrwxrwx 1 root root   9 Jan 27 23:19 usb-Sandisk_Ultra_0401e72b70214457f9024196cfe7310c5cd6b2abba0d130404df526e5fbf585ef0650000000000000000000057816446009b071881558107b8a62b4f-0:0 -> ../../sdb
lrwxrwxrwx 1 root root  10 Jan 27 23:19 usb-Sandisk_Ultra_0401e72b70214457f9024196cfe7310c5cd6b2abba0d130404df526e5fbf585ef0650000000000000000000057816446009b071881558107b8a62b4f-0:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root   9 Jan 27 11:40 wwn-0x5000c5003dbd1150 -> ../../sda
lrwxrwxrwx 1 root root  10 Jan 27 11:40 wwn-0x5000c5003dbd1150-part1 -> ../../sda1

实际使用的分区有sda1(随机存储驱动器)、nvme0n1p3(windows驱动器)、nvme1n1p2(linux驱动器)和sdb1(闪存驱动器)。我知道“使用”和“未使用”之间的区别没有明确定义,可以根据用户进行不同的解释,但我基本上想要的是文件管理器(在我的情况下为 thunar)在此屏幕截图中显示的设备列表.

list of all devices in file manager thunar

“Dateisystem”是主要的linux驱动器,所以/dev/nvme1n1p2,“Datenträger 1000 GB”是主要的windows驱动器,所以/dev/nvme0n1p3,“ESD-USB”是闪存驱动器,所以/dev/sdb1 .请注意,这里缺少 /dev/sda1,因为它在 /Files 下有一个自定义挂载。

在 C++ 中获得完全相同的存储设备列表的方法是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)