在Linux和Windows系统下使用Qt监测U盘的插拔事件
在Linux和Windows系统下使用Qt监测U盘的插拔事件
- Chapter1 在Linux系统下使用Qt监测U盘的插拔事件(方法1,使用lsblk命令)
- 方法概述
- Chapter2 在Linux或者Windows系统下使用Qt监测U盘的插拔事件(方法2,使用QStorageInfo类)
- 1、概述
- 2、重要方法
- 3、重要信号
- 4、试验结果
Chapter1 在Linux系统下使用Qt监测U盘的插拔事件(方法1,使用lsblk命令)
原文链接:https://blog.csdn.net/qq_44849154/article/details/129711381
本文在Qt提供一段监测U盘数量的一段代码,可以监听U盘的插入和拔出,亲测可用。
QStringList Widget::listUSBDevices()
{int i =0;QProcess piTerminal;piTerminal.start("sh",QStringList()<<"-c"<<"lsblk|grep media|grep part|grep -o -E '/.*'");piTerminal.waitForFinished();QString ret=piTerminal.readAllStandardOutput();QStringList list=ret.split("\n");if(list.size()!=1){for(i=0;i<list.size();i++){qDebug()<<list.at(i);//输出U盘的绝对路径ui->textBrowser->append(list.at(i));}ui->textBrowser->append(QString("检测到 %1个U盘").arg(i-1));}if(list.size()==1){qDebug()<<"未检测到U盘插入,请插入后重试";ui->textBrowser->append(QString("未检测到U盘插入,请插入后重试"));}return list;
}
使用Qt监测U盘的插拔事件也可以通过监听DBus信号实现。以下是分步说明和示例代码:
方法概述
- 使用DBus监听U盘事件:通过org.freedesktop.UDisks2服务,订阅InterfacesAdded和InterfacesRemoved信号。
- 过滤U盘设备:检查信号参数,确定是否为可移动USB存储设备。
- 处理挂载信息:通过DBus获取设备的挂载点和其他属性。
Chapter2 在Linux或者Windows系统下使用Qt监测U盘的插拔事件(方法2,使用QStorageInfo类)
原文链接:https://blog.csdn.net/ckg3824278/article/details/143859458
1、概述
QStorageInfo是Qt框架中用于获取和管理存储设备信息的类。它提供了关于当前系统中挂载的存储设备和驱动器的详细信息,包括空间大小、挂载点、标签名、文件系统名等。QStorageInfo类在Qt 5.4版本中引入,为开发人员提供了一个简洁而强大的接口来查询和管理系统中的存储设备信息。
2、重要方法
QStorageInfo类提供了一系列方法来获取存储设备的信息,以下是一些重要的方法:
- QStorageInfo::mountedVolumes():返回当前系统中所有已挂载文件系统的列表。
- QStorageInfo::root():返回根文件系统的QStorageInfo对象。
- QStorageInfo::bytesTotal():返回存储设备的总字节数。
- QStorageInfo::bytesAvailable():返回存储设备上可用的字节数。
- QStorageInfo::bytesFree():返回存储设备上的空闲字节数(注意:在某些平台上,bytesFree()和bytesAvailable()可能返回相同的结果)。
- QStorageInfo::name():返回存储设备的名称。
- QStorageInfo::displayName():返回存储设备的显示名称。
- QStorageInfo::fileSystemType():返回存储设备的文件系统类型。
- QStorageInfo::isReadOnly():判断存储设备是否只读。
- QStorageInfo::isReady():判断存储设备是否准备就绪。
- QStorageInfo::isValid():判断QStorageInfo对象是否有效。
- QStorageInfo::setPath(const QString &path):设置QStorageInfo对象的路径,以引用该路径所在的卷。
- QStorageInfo::refresh():刷新QStorageInfo对象的信息,使其无效化缓存并重新检索。
3、重要信号
QStorageInfo类是一个静态类,主要提供用于查询存储设备信息的方法,而不涉及信号与槽的机制。因此,QStorageInfo类没有定义任何信号。
#include <QCoreApplication>
#include <QStorageInfo>
#include <QDebug>int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);// 获取当前系统中所有已挂载的文件系统列表QList<QStorageInfo> storageInfoList = QStorageInfo::mountedVolumes();// 遍历列表并打印每个存储设备的信息for (const QStorageInfo &storage : storageInfoList) {if (storage.isValid() && storage.isReady()) {qDebug() << "Name:" << storage.name();qDebug() << "Display Name:" << storage.displayName();qDebug() << "Root Path:" << storage.rootPath();qDebug() << "File System Type:" << storage.fileSystemType();qDebug() << "Total Bytes:" << storage.bytesTotal() / (1024 * 1024) << "MB";qDebug() << "Available Bytes:" << storage.bytesAvailable() / (1024 * 1024) << "MB";qDebug() << "Read Only:" << storage.isReadOnly();}}return a.exec();
}
4、试验结果
void Widget::debugStorageInfo()
{foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {qDebug() << "Device:" << storage.device()<< "Root:" << storage.rootPath()<< "FS:" << storage.fileSystemType()<< "Size:" << storage.bytesTotal() / (1024 * 1024) << "MB"<< "USB:" << (isUSBDevice(storage) ? "Yes" : "No");// if(storage.fileSystemType() == "FAT32")if(storage.fileSystemType() == "vfat"){qDebug() << QString::fromLocal8Bit("U盘名称为:")<<storage.name()<< QString::fromLocal8Bit("U盘路径为:")<<storage.rootPath();}}
}bool Widget::isUSBDevice(const QStorageInfo &storage)
{// Linux系统下通过设备路径判断if (storage.device().contains("/dev/sd") || storage.device().contains("/dev/disk/by-id/usb")) {return true;}// Windows系统下通过设备类型判断// if (storage.fileSystemType() == "NTFS" || storage.fileSystemType() == "FAT32") {if (storage.fileSystemType() == "vfat") {// 可能需要更精确的判断逻辑return true;}return false;
}
QString diskPath = usbdisk.debugStorageInfo();// 检查是否是升级U盘if (QFile::exists(diskPath + "/upgrade/package.upg.zip")) {QMessageBox::information(this, tr("检测到升级U盘"),tr("发现升级文件,是否开始升级?"));}