Обнаружение подключенных дисков в Linux и Mac OS X

Я использую QDir::drives() чтобы получить список дисков. Он отлично работает в Windows, но в Linux и Mac возвращает только один элемент «/», т.е. е. корень. Это ожидаемое поведение, но как я могу получить список дисков на Mac и Linux?

Не-Qt, нативные API-решения также приветствуются.

Разъяснение определения «диска»: я хотел бы получить список точек монтирования, которые отображаются как «диски» во встроенном файловом менеджере Finder или Linux.

2

Решение

Что касается файловой системы, в Unix / Linux нет концепции дисков (я не могу поручиться за MacOSX, но я бы сказал, что это то же самое). Ближайшая вещь, вероятно, была бы точками монтирования, но обычное приложение не должно беспокоиться о них, так как все уже доступно в корне файловой системы / (отсюда и поведение QDir::drives() что вы наблюдаете).

Если вы действительно хотите увидеть, какие точки монтирования используются, вы можете проанализировать вывод mount команда (без каких-либо аргументов) или, по крайней мере, в Linux, содержимое /etc/mtab файл. Тем не менее, остерегайтесь, точки монтирования могут быть очень быстрыми (петлевые устройства, файловые системы FUSE, сетевые ресурсы и т. Д.), Поэтому, опять же, я бы не рекомендовал использовать их, если ваше приложение не предназначено для их администрирования.

Имейте в виду, что в ОС Unix-y точки монтирования обычно являются вопросом системных администраторов, а не конечных пользователей, если мы не говорим о съемных носителях или временных сетевых ресурсах.


Редактировать: Следуя вашим разъяснениям в комментариях, вы должны использовать Linux getmntent или же getmntent_r разобрать содержимое /etc/mtab файл и, таким образом, получить список всех точек монтирования и соответствующих устройств.

Уловка после этого состоит в том, чтобы определить, какие из них вы хотите отобразить (съемный «сетевой ресурс»). я знаю это /sys/block/... может помочь с этим, но я не знаю всех деталей, поэтому вам придется копать немного больше.

Например, чтобы проверить, /dev/sdd1 (USB-ключ) установлен на /media/usb0/ это съемное устройство, вы могли бы сделать (обратите внимание, как я использую имя устройства sdd, а не имя раздела sdd1):

$ cat /sys/block/sdd/removable
1

В отличие от моего основного жесткого диска:

$ cat /sys/block/sda/removable
0

Надеюсь, что это ставит вас на правильный путь.

5

Другие решения

Для OS X Дисковый Арбитраж может использоваться для отображения и мониторинга дисков и точек монтирования

4

Выскабливать вывод mount Команда shell, безусловно, является одним из вариантов на любой платформе — хотя, каково ваше определение диска здесь? Физические носители, сменные драйверы, сетевые тома? Вам нужно будет сделать много фильтрации.

В MacOSX точка монтирования для съемных носителей, сетевых томов и дополнительных жестких дисков всегда находится под /Volumes/, так что простое перечисление элементов в этом каталоге сделает свое дело, если ваше определение диска широкое. Это должно быть довольно безопасно, поскольку все они установлены автоматически.

В Linux существует множество мест в зависимости от используемого дистрибутива. /mnt/ это традиционный, но есть и другие.

1

В Linux способ получения информации о подключенных дисках в настоящее время заключается в разборе mtab файл. glibc предоставляет макрос _PATH_MNTTAB чтобы найти этот файл. Увидеть http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-Information

1

Если вы знаете формат диска / дисков, о которых идет речь, вы можете использовать команду df для вывода списка дисков из консоли или программно как системную команду. Например, чтобы найти все диски ext4:

df -t ext4

Вы можете просто добавить дополнительные форматы к той же команде, если вас интересует более одного типа:

df -t ext4 -t tmpfs

Это вернет вам физическое местоположение диска, объем памяти, который он имеет, объем используемой памяти, объем свободной памяти,% использования и место, где он смонтирован в файловой системе.

df покажет вам все диски, смонтированные в системе, но некоторые будут вещами, которые не совсем то, что вы ищете, например, временные файловые системы и т. д.

Не уверен, будет ли это работать на OSX или нет, но он работает на моем дистрибутиве Ubuntu 12.04.

1

Другой способ — проверить «Тома».

DF -H | grep «/ Объемы»

1

Я знаю, что это старо, но упомянуть не удалось getfsstat который я использовал в macos. Вы можете получить список креплений (которые будут включать большинство дисков), используя getfsstat, Увидеть man 2 getfsstat для дополнительной информации.

1
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector