Qt 本身不提供直接的 USB 設備操作 API,需結合平台特定方式:
QDir/QFileInfo 遍歷。QStorageInfo::mountedVolumes() 獲取磁碟機,篩選可移動磁碟,再遍歷檔案系統。QStorageInfo (Qt 5.4+) 統一獲取掛載點資訊。#include <QStorageInfo>
#include <QFileInfo>
#include <QTableWidget>
void MainWindow::loadUsbContents()
{
ui->tableWidget->setColumnCount(4);
ui->tableWidget->setHorizontalHeaderLabels({"名稱", "大小", "類型", "修改時間"});
foreach (const QStorageInfo &storage, QStorageInfo::mountedVolumes()) {
if (storage.isValid() && storage.isReady() &&
(storage.device().contains("usb", Qt::CaseInsensitive) ||
storage.rootPath().contains("media") ||
storage.rootPath().contains("mnt")))
{
QDir usbDir(storage.rootPath());
QStringList filters;
filters << "*.*" ; // 所有檔案
usbDir.setNameFilters(filters);
QFileInfoList list = usbDir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
ui->tableWidget->setRowCount(list.size());
for (int i = 0; i < list.size(); ++i) {
const QFileInfo &fi = list[i];
ui->tableWidget->setItem(i, 0, new QTableWidgetItem(fi.fileName()));
ui->tableWidget->setItem(i, 1, new QTableWidgetItem(fi.isDir() ? "目錄" :
QString::number(fi.size() / 1024) + " KB"));
ui->tableWidget->setItem(i, 2, new QTableWidgetItem(fi.suffix().isEmpty() ? "目錄" : fi.suffix()));
ui->tableWidget->setItem(i, 3, new QTableWidgetItem(fi.lastModified().toString("yyyy-MM-dd hh:mm")));
}
break; // 僅處理第一個 USB 設備,實際可列表讓用戶選擇
}
}
}
QFileSystemWatcher 監聽 USB 掛載/卸載事件。umount,Windows 需呼叫 CM_Request_Device_Eject (SetupAPI)。plugdev 群組或配置 udev 規則。完整 Demo 可參考:Qt 讀取 USB 內容並顯示於表格