Как можно проверить монтирование определенного устройства, usb-флешки в qt с помощью команды mount?
Как можно проверить монтирование определенного устройства, usb-флешки в qt с помощью команды mount ? Вот пример хочу проверить есть ли монтирование usb-флешки dev/sdb как это сделать?
Ответы (1 шт):
Автор решения: Alexander Chernin
→ Ссылка
- Через 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()` - если что-то пошло не так.
- Через таймер. Например (для 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();