Как составить список / dev / sda usb-хранилищ, смонтированных с помощью комбинированного списка - PullRequest
0 голосов
/ 30 января 2019

Я ищу способ показать путь к USB-хранилищу, когда они подключены, путь должен быть показан в выпадающем списке (в графическом интерфейсе, который я разрабатываю с помощью qt creator (qt 5.9)).Я искал, как это сделать, но я ничего не нашел.Что я хочу, это что-то вроде:

https://catenarios2.files.wordpress.com/2012/11/002.jpg

Не могли бы вы помочь мне продолжить мой проект?Буду очень признателен, если вы предоставите пример.

Большое спасибо

1 Ответ

0 голосов
/ 02 февраля 2019

Основная идея та же - вы запускаете инструмент Linux через QProcess и анализируете результат.Вот простой набросок:

#include <QCoreApplication>
#include <QProcess>
#include <QDebug>

#include <usb.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QProcess devList;
    devList.start("lsblk", QStringList() << "-o" << "KNAME");
    if (!devList.waitForStarted())
        return false;

    if (!devList.waitForFinished())
        return false;

    QString result = QString(devList.readAll());
    qDebug() << result;

    return a.exec();
}

Вы можете использовать любую другую команду siutable (ее довольно легко найти), и, конечно, она должна улучшить синтаксический анализ, но в целом все одинаково.

AFAIK, точки монтирования могут быть получены из /proc/mounts с чем-то вроде ...

#include <QCoreApplication>

#include <mntent.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    struct mntent *ent;
    FILE *aFile;

    aFile = setmntent("/proc/mounts", "r");
    if (aFile == NULL) {
      perror("setmntent");
      exit(1);
    }
    while (NULL != (ent = getmntent(aFile))) {
      printf("%s %s\n", ent->mnt_fsname, ent->mnt_dir);
    }
    endmntent(aFile);

    return a.exec();
}

Лучше, чем cat запуск или что-то еще, также взятые из некоторого фрагмента и должны бытьулучшенный.И, наконец, в случае, если вам понадобится информация об устройстве в USD, это может быть что-то вроде ...

#include <QCoreApplication>

#include <usb.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    struct usb_bus *bus;
    struct usb_device *dev;
    usb_init();
    usb_find_busses();
    usb_find_devices();
    for (bus = usb_busses; bus; bus = bus->next)
    {
        for (dev = bus->devices; dev; dev = dev->next)
        {
            printf("Trying device %s/%s\n", bus->dirname, dev->filename);
            printf("\tID_VENDOR = 0x%04x\n", dev->descriptor.idVendor);
            printf("\tID_PRODUCT = 0x%04x\n", dev->descriptor.idProduct);
        }
    }

    return a.exec();
}

Это требует sudo apt-get libusb-dev + компиляции с -lusb.

Нена самом деле большая часть Qt в проблеме и более фундаментальные «кодирующие» решения возможны, но, надеюсь, это даст вам толчок к подходящему решению.

...