Я использую QDir::drives()
чтобы получить список дисков. Он отлично работает в Windows, но в Linux и Mac возвращает только один элемент «/», т.е. е. корень. Это ожидаемое поведение, но как я могу получить список дисков на 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/...
может помочь с этим, но я не знаю всех деталей, поэтому вам придется копать немного больше.
Например, чтобы проверить, /dev/sdd1
(USB-ключ) установлен на /media/usb0/
это съемное устройство, вы могли бы сделать (обратите внимание, как я использую имя устройства 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-Information
Если вы знаете формат диска / дисков, о которых идет речь, вы можете использовать команду df для вывода списка дисков из консоли или программно как системную команду. Например, чтобы найти все диски ext4:
df -t ext4
Вы можете просто добавить дополнительные форматы к той же команде, если вас интересует более одного типа:
df -t ext4 -t tmpfs
Это вернет вам физическое местоположение диска, объем памяти, который он имеет, объем используемой памяти, объем свободной памяти,% использования и место, где он смонтирован в файловой системе.
df покажет вам все диски, смонтированные в системе, но некоторые будут вещами, которые не совсем то, что вы ищете, например, временные файловые системы и т. д.
Не уверен, будет ли это работать на OSX или нет, но он работает на моем дистрибутиве Ubuntu 12.04.
Другой способ — проверить «Тома».
DF -H | grep «/ Объемы»
Я знаю, что это старо, но упомянуть не удалось getfsstat
который я использовал в macos. Вы можете получить список креплений (которые будут включать большинство дисков), используя getfsstat
, Увидеть man 2 getfsstat
для дополнительной информации.