Как можно проверить монтирование определенного устройства, usb-флешки в qt с помощью команды mount?

Как можно проверить монтирование определенного устройства, usb-флешки в qt с помощью команды mount ? Вот пример хочу проверить есть ли монтирование usb-флешки dev/sdb как это сделать?


Ответы (1 шт):

Автор решения: Alexander Chernin
  1. Через QProcess (стырено):
#include <QCoreApplication>
#include <QProcess>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QProcess df;
    df.start("mount", QStringList()<<"/dev/sdb1"<<"/root/media");
    df.waitForFinished();
    QString str=df.readAll();
    std::cout<<"hgh="<<str.toStdString()<<std::endl;
    return 0;
}

Есть еще сигналы `readAllStandardOutput()` - если все норм, а `readAllStandardError()` - если что-то пошло не так.
  1. Через таймер. Например (для Qt5+):
class MountWatcher : public QObject {
    Q_OBJECT
public:
    MountWatcher(QObject* parent=nullptr) {

        // Проверка состояния пути отслеживания
        QObject::connect(&timer, QTimer::timeout, [&](){
            QMutableMapIterator<QString, int> i(_mountPathes);
            while (i.hasNext()) {
                i.next();
                // Если директория существует
                if( QDir::exists(i.key()) ) {

                    // Если значение state (i.value), не было установлено в true
                    // то установить и послать об этом сигнал
                    if( !i.value() ) {
                        _mountPathes.setValue(true);
                        emit mountChanged(i.key(), true);                        
                    }
                } else {
                    // Если размонтировано, то просигнализировать об этом один раз                    
                    if( i.value() ) {
                        _mountPathes.setValue(false);
                        emit mountChanged(i.key(), false);  
                    }
                }
            }
        });
    }

signals:
    // Сигнал о монтировании/размонтирования
    void mountChanged(const QString& path, bool state);    

public slots:
    // Добавить пути отслеживания существования (монтирования/размонтирования)
    void addPath(const QString& path) {
        if( !_mountPathes.contains(path) )
            _mountPathes.insert(path, false);
    }

    // Начать отслеживать
    void startWatch(int msec=1000) {
        _timer.start(msec);
    }
    
    // Перестать отслеживать
    void stop() {
        _timer.stop();
    }

private:
    QTimer _timer;
    // key - путь, value - состояние монтирования
    QMap<QString, bool> _mountPathes;
}

Теперь это можно использовать так:

MountWatcher watcher;
watcher.addPath('/media/usbhd-sdb1');

connect(&watcher, &MountWatcher::mountChanged, [&](QString path, bool state) {
    //...
});

watcher.startWatch();
→ Ссылка