Russian Qt Forum

Программирование => Общий => Тема начата: Андрей80 от Август 03, 2010, 15:47



Название: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Андрей80 от Август 03, 2010, 15:47
Здравствуйте.
Используя Qt::drives() получаю список дисков в системе linux ubuntu.
Как и обещали разработчики библиотеки (QDir::Drives   0x004   List disk drives (ignored under Unix)),  особенно много получить не удалось. Но наверняка решить проблему возможно, подскажите пожалуйста, кто сталкивался.
Как можно получить список разделов своего жесткого диска?


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: crossly от Август 03, 2010, 15:51
/proc/partitions


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: kuzulis от Август 03, 2010, 15:51
Запускать и парсить вывод утилит типа cfdisk, fdisk и т.п. или еще как нибудь. Парсить устройства в /dev например... Вариантов уйма.
---

Упс.. опередили

Вот еще ссылка: http://xmelegance.org/kparted/index.html - там используется библиотека libparted


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: crossly от Август 03, 2010, 16:15
для использования cfdisk, fdisk нужны права root....


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 01, 2012, 20:21
для использования cfdisk, fdisk нужны права root....
Да нет на fdisk -l обычных прав должно хватить с избытком
ну а дальше тупо пишем скрипт
fdisk -l| awk '/Disk||Диск/ {print($1 " " $2 " "$3)}'


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: andrew.k от Август 01, 2012, 23:13
для использования cfdisk, fdisk нужны права root....
Да нет на fdisk -l обычных прав должно хватить с избытком
ну а дальше тупо пишем скрипт
fdisk -l| awk '/Disk||Диск/ {print($1 " " $2 " "$3)}'
у меня fdisk -l требует права рута. Значит везде по-разному.
а вот на чтение /proc/partitions прав точно должно хватить.
а преимуществ вызова fdisk нет, скорее наоборот медленнее будет.


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Alex Custov от Август 01, 2012, 23:53
у меня fdisk -l требует права рута. Значит везде по-разному.

круто, это где так?


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Fat-Zer от Август 02, 2012, 01:30
для fdisk -l нужны права на чтение /dev/sd? . обычно для этого пользователю нужно быть в группе disk или block. и если он лежит в /sbin, то само собой надо полный путь указать...

ещё есть Ъ способ: запросить всю эту информацию у udev'а (то есть udisks) через dbus. см. доки по оному...
если надо, у меня где-то был на c/glib пример с получением списка дисков...


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: DmitryM от Август 02, 2012, 07:37
а как насчет чтение /etc/mtab ?
Человеку ведь нужен список точек монтирования устройств.


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 02, 2012, 08:21
а как насчет чтение /etc/mtab ?
Человеку ведь нужен список точек монтирования устройств.
Не вариант, в mtab уже об смонтированных. А если программа предполагает монтирования, там для нее данных не будет


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 02, 2012, 08:28
для использования cfdisk, fdisk нужны права root....
Да нет на fdisk -l обычных прав должно хватить с избытком
ну а дальше тупо пишем скрипт
fdisk -l| awk '/Disk||Диск/ {print($1 " " $2 " "$3)}'
у меня fdisk -l требует права рута. Значит везде по-разному.
а вот на чтение /proc/partitions прав точно должно хватить.
а преимуществ вызова fdisk нет, скорее наоборот медленнее будет.

Да ваш метод удобен, единственное, ручками размер в человеческий вид придется переделывать


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: DmitryM от Август 02, 2012, 09:30
а как насчет чтение /etc/mtab ?
Человеку ведь нужен список точек монтирования устройств.
Не вариант, в mtab уже об смонтированных. А если программа предполагает монтирования, там для нее данных не будет
Это правильный вариант, т. к. QDir::drives ()
Цитировать
On Windows this returns a list of QFileInfo objects containing "C:/", "D:/", etc
Если устройство подключено, то его всегда можно найти в /dev


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 02, 2012, 10:07
а как насчет чтение /etc/mtab ?
Человеку ведь нужен список точек монтирования устройств.
Не вариант, в mtab уже об смонтированных. А если программа предполагает монтирования, там для нее данных не будет
Это правильный вариант, т. к. QDir::drives ()
Цитировать
On Windows this returns a list of QFileInfo objects containing "C:/", "D:/", etc
Если устройство подключено, то его всегда можно найти в /dev
Абсолютная ваша правда, если программа предполагает, что все уже смонтированно. Иначе мы возвращаемся к /proc/partition fdisk, ну или парсить директорию /dev. Но как ее парсить если сборщик определил имена дисков не как стандартные sd??, а по другому ?


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: andrew.k от Август 02, 2012, 10:09
а как насчет чтение /etc/mtab ?
Человеку ведь нужен список точек монтирования устройств.
Не вариант, в mtab уже об смонтированных. А если программа предполагает монтирования, там для нее данных не будет
Это правильный вариант, т. к. QDir::drives ()
Цитировать
On Windows this returns a list of QFileInfo objects containing "C:/", "D:/", etc
Если устройство подключено, то его всегда можно найти в /dev
Абсолютная ваша правда, если программа предполагает, что все уже смонтированно. Иначе мы возвращаемся к /proc/partition fdisk, ну или парсить директорию /dev. Но как ее парсить если сборщик определил имена дисков не как стандартные sd??, а по другому ?
В директории /dev могут быть все возможные устройства, а не только подключенные на данный момент.


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: DmitryM от Август 02, 2012, 11:19
Абсолютная ваша правда, если программа предполагает, что все уже смонтированно. Иначе мы возвращаемся к /proc/partition fdisk, ну или парсить директорию /dev. Но как ее парсить если сборщик определил имена дисков не как стандартные sd??, а по другому ?
Ты много видел систем, где именуется не по стандарту? Да и /proc/partition fdisk не покажет usb, cdrom, floppy.

Цитировать
В директории /dev могут быть все возможные устройства, а не только подключенные на данный момент.
Через тот же udev можно удалить устройство из /dev.


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 02, 2012, 11:47
Абсолютная ваша правда, если программа предполагает, что все уже смонтированно. Иначе мы возвращаемся к /proc/partition fdisk, ну или парсить директорию /dev. Но как ее парсить если сборщик определил имена дисков не как стандартные sd??, а по другому ?
Ты много видел систем, где именуется не по стандарту? Да и /proc/partition fdisk не покажет usb, cdrom, floppy.

Цитировать
В директории /dev могут быть все возможные устройства, а не только подключенные на данный момент.
Через тот же udev можно удалить устройство из /dev.
Код:
Вывод с моего /proc/partitions
8        0  732574584 sda
   8        1          1 sda1
   8        5  341991657 sda5
   8        6  390580281 sda6
   8       16  976761527 sdb
   8       17  976760001 sdb1
   8       32  244198584 sdc
   8       33     104391 sdc1
   8       34    1028160 sdc2
   8       35  102406342 sdc3
   8       36  140657107 sdc4
  11        0    1048575 sr0
   8       48    7831552 sdd
   8       49    7830528 sdd1
sdd -это флешка, sr0 -cdrom - не то ни другое не подмантированно fd0 у меня нет просто нет устройства
На фре если не изменилось ничего было hda - на жесткие


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: andrew.k от Август 02, 2012, 13:54
Абсолютная ваша правда, если программа предполагает, что все уже смонтированно. Иначе мы возвращаемся к /proc/partition fdisk, ну или парсить директорию /dev. Но как ее парсить если сборщик определил имена дисков не как стандартные sd??, а по другому ?
Ты много видел систем, где именуется не по стандарту? Да и /proc/partition fdisk не покажет usb, cdrom, floppy.
usb еще как покажет, почему нет?
cdrom, floppy это отдельная песня.

Цитировать
В директории /dev могут быть все возможные устройства, а не только подключенные на данный момент.
Через тот же udev можно удалить устройство из /dev.
А если нет udev? да и зачем удалять? Раз система насоздавала, значит она по-другому не умеет.


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: DmitryM от Август 02, 2012, 14:22
А если нет udev?
А что вместо udev в Linux, devfs/hotplug?

да и зачем удалять? Раз система насоздавала, значит она по-другому не умеет.
Все она умеет. У меня Gnome удаляет устройство из /dev при размонтирования флешки.


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: andrew.k от Август 02, 2012, 14:48
А если нет udev?
А что вместо udev в Linux, devfs/hotplug?
хотплаг

да и зачем удалять? Раз система насоздавала, значит она по-другому не умеет.
Все она умеет. У меня Gnome удаляет устройство из /dev при размонтирования флешки.
А у меня не умеет, у меня МСВС :)


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: DmitryM от Август 02, 2012, 15:06
А у меня не умеет, у меня МСВС :)
Ненавижу MCBC за ld-linux.so.1
Когда сертифицируют ядро 2.6 появиться udev ;)


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: andrew.k от Август 02, 2012, 15:11
А у меня не умеет, у меня МСВС :)
Ненавижу MCBC за ld-linux.so.1
Когда сертифицируют ядро 2.6 появиться udev ;)
К тому времени, когда сертифицируют, 2.6 уже будет как сейчас 2.4 :)


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 02, 2012, 17:06
у меня тут получилось что то в этом роде, единственное, я выбираю только не смонтированные устройства
Код:
void QMount_Widget::get_devices(QStringList *devices_name){
    QFile       file;
    QTextStream stream(&file);
    QString     buffer;
    QStringList buffer_list;
    file.setFileName("/proc/partitions");
    if(file.open(QIODevice::Text|QIODevice::ReadOnly)){
        buffer=stream.readAll();
        file.close();
    }
    buffer_list=buffer.split(QRegExp("\\W+\\d+"),QString::SkipEmptyParts);
    buffer_list.removeFirst();
    buffer.clear();
    for(int i=0;i<buffer_list.count();i++)
        buffer+=buffer_list.at(i);
    buffer.remove(QRegExp("[a-z]{3}\\s"));
    buffer_list=buffer.split(QRegExp("\\s+"),QString::SkipEmptyParts);
    for(int i=0;i<buffer_list.count();i++){
        buffer_list[i]="/dev/"+buffer_list.at(i);
        devices_name->append(buffer_list.at(i));
    }
    buffer.clear();
    buffer_list.clear();
    file.setFileName("/etc/mtab");
    if(file.open(QIODevice::Text|QIODevice::ReadOnly)){
        buffer=stream.readAll();
        file.close();
    }
    int lastpos=0,number_item=0,count_items;
    count_items=buffer.count(QRegExp("\/dev\/[a-z]{2,3}\\d"));
    for(int i=0;i<count_items;i++){
        lastpos=buffer.indexOf(QRegExp("\/dev\/[a-z]{2,3}\\d"),lastpos);
        number_item=buffer.indexOf(" ",lastpos)-lastpos;
        buffer_list.append(buffer.mid(lastpos,number_item));
        lastpos+=number_item;
    }
    for(int i=0;i<buffer_list.count();i++)
        devices_name->removeAt(devices_name->indexOf(buffer_list.at(i)));
    for(int i=0;i<devices_name->count();i++) qDebug()<<devices_name->at(i);
}


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: andrew.k от Август 02, 2012, 17:21
у меня тут получилось что то в этом роде, единственное, я выбираю только не смонтированные устройства
Зачем ты используешь QTextStream, если то же самое можно сделать с помощью QFile?
file.readAll()


Название: Re: Как используя Qt узнать какие существуют диски и их разделы в linux?
Отправлено: Silentium от Август 02, 2012, 20:47
у меня тут получилось что то в этом роде, единственное, я выбираю только не смонтированные устройства
Зачем ты используешь QTextStream, если то же самое можно сделать с помощью QFile?
file.readAll()
Привычка, как первый раз пример просмотрел в документации, так и использую. как то даже не задумывлся что без него можно использовать. Спасибо учту на будущее