LINUX.ORG.RU

Работа с UUID разделов в Qt.

 , , ,


0

1

Здравствуйте! Подскажите, пожалуйста, есть ли возможность средствами Qt вычислять какой-нибудь UUID для раздела диска с файловой системой, чтобы он являлся платформонезависимым?

Хочется, например, вычислить UUID флэш-носителя с одним разделом в fat32, запомнить-вычислить его с помощью своей программы, принести на другой ПК с любой поддерживаемой операционкой и получить тот же UUID в версии программы для этой ОС, чтобы в итоге всегда иметь возможность узнать корректную точку монтирования для одного и того же устройства, получить возможность формировать путь до файла, не привязываясь к точке монтирования.

В linux, насколько я понимаю, можно узнать UUID, кажется, с помощью библиотеки blkidlib, у Windows есть в API:

BOOL WINAPI GetVolumeNameForVolumeMountPoint(
  _In_   LPCTSTR lpszVolumeMountPoint,
  _Out_  LPTSTR lpszVolumeName,
  _In_   DWORD cchBufferLength
);
и какая-то консольная утилита mountvol, но UUID (реализация в Windows называется GUID) будут разные для одного и того же диска в разных операционках, если использовать эти средства?

Есть ли универсальное решение (если на основе Qt, то вообще прекрасно) которое бы позволяло получить UUID для раздела диска, одинаковое в разных операционках? Правильно ли я формулирую задачу, возможно ли реализовать что-то подобное?

Если готового решения нет, но сделать это возможно, подскажите, пожалуйста, направление действий для реализации средствами Qt.

Медитируй на

ls /dev/disk/by-uuid/ -l
Pavval ★★★★★ ()
Ответ на: комментарий от Pavval

спасибо, но не проблема получить в линуксах uuid нужный, проблема в том, как правильно получить такое же значение для одного и того же устройства на остальных операционках.

yetanotherandreyev ()

если на основе Qt, то вообще прекрасно

quuid?

вообще, емнип, uuid для раздела генерится рандомно при создании и хранится в суперблоке, т.е. надо его читать оттудова, а не генерить. Или же, если надо просто «какой-то uuid» без привязки к тому, что говорит blkid, то сочинять, где хранить идентифицирующий раздел uuid, вычисленный самостоятельно.

arkhnchul ★★ ()
Ответ на: комментарий от yetanotherandreyev

как правильно получить такое же значение для одного и того же устройства на остальных операционках.

uuid - не хеш.

arkhnchul ★★ ()

Есть ли универсальное решение

Нет, не слышал. Разве что использовать QProcess для запуска blkid на линуксе или diskutil info в макоси.

quiet_readonly ★★★★ ()
Ответ на: комментарий от arkhnchul

gparted умеет заменять uuid раздела, нажимаешь кнопочку и готово

anonymous ()
Ответ на: комментарий от arkhnchul

О, а я почему-то считал, что uuid - это именно хэш, который меняется еще к тому же со сменой метки диска.

Буду искать, куда он записывается при переформатировании, спасибо большое!

yetanotherandreyev ()
Ответ на: комментарий от anonymous

менять uuid мне нет нужды, мне нужно просто его считывать на всех поддерживаемых Qt платформах

yetanotherandreyev ()
Ответ на: комментарий от yetanotherandreyev

имхо проще всего будет раздербанить blkid на этот предмет.

arkhnchul ★★ ()

Нашел среди дополнительных модулей Qt5 Qt System Info, который является «логическим продолжением» модуля systeminfo от Qt Mobility для Qt4, обрадовался. У него (как и у старого модуля для Qt4 Mobility, так и у нового модуля для Qt5) для класса QStorageInfo как раз есть метод:

Q_INVOKABLE QString uriForDrive(const QString &drive) const;

На родном Arch Linux модуль Qt System Info для Qt5 не собрался пока что, поэтому просто включил в проекте Qt Creator модуль systeminfo от Qt4 Mobility и успешно с помощью uriForDrive получаю uuid, например, раздела, который примонтирован в /home.

На виртуалке запускаю Windows XP, там Qt 5.0.1 for Windows 32-bit (MinGW 4.7, 823 MB) с Qt Project. Там Qt Mobility собираться не захотелась, но собрался модуль qt5-systeminfo, успешно, ошибок не увидел. Подключаю его в проект, ошибок нет, но для любых дисков выдает uriForDrive пустую QString =(

yetanotherandreyev ()
Ответ на: комментарий от yetanotherandreyev

поправка: метод uriForDrive(...) из Qt System Info работает хорошо, надо было только корректно передавать ему в Windows строчку с обратным слэшем в конце (спасибо огромное одному коммитеру Qt System Info за помощь). Однако, проблему так и не решил пока: выдаваемые Windows GUID для разделов не совпадают c UUID для тех же разделов, выдаваемых Linux, потому что fat/ntfs не поддерживают в своем стандарте uuid, насколько я понял.

yetanotherandreyev ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.