Qt總結之三:磁碟檔案操作、遍歷資料夾和檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(三)
阿新 • • 發佈:2019-01-05
前言
本節內容主要包括磁碟容量檢測、磁碟內指定或特定檔案的操作
話不多說,先上效果圖
共分為兩個部分,第一部分是檢測磁碟容量,第二部分是篩選磁碟內指定檔案(test.txt)或特定檔案(.txt / .png型別檔案)
獲取磁碟容量關鍵函式:【fileapi.h】 GetDiskFreeSpaceEx()
void DiskSend::GetDiskSpace(QString strDisk, double& dTotalBytes, double& dFreeBytes) { LPCWSTR lpcwstrDriver = (LPCWSTR)strDisk.utf16(); ULARGE_INTEGER lFreeBytesAvailable, lTotalBytesTemp, lTotalFreeBytes; if (!GetDiskFreeSpaceEx(lpcwstrDriver, &lFreeBytesAvailable, &lTotalBytesTemp, &lTotalFreeBytes)) { QMessageBox::warning(0, "Warning", "Acquire Disk Space Failed !"); dTotalBytes = -1; dFreeBytes = -1; return; } //unit : GB dTotalBytes = lTotalBytesTemp.QuadPart / 1024.0 / 1024 / 1024; dFreeBytes = lTotalFreeBytes.QuadPart / 1024.0 / 1024 / 1024; ui.totalLabel->setText(QString::number(dTotalBytes, 'f', 3));//總計:xxGB ui.freeLabel->setText(QString::number(dFreeBytes, 'f', 3));//剩餘可用: xxGB }
一、磁碟容量檢測
該模組細分三個子模組
(1)通過改變QCommboBox indexcahnged訊號槽,來獲取對應磁碟總容量和所剩可用容量
定義QcommBox訊號槽,獲取磁碟String
connect(ui.comboBox, SIGNAL(currentIndexChanged(const QString&)), this, SLOT(slotDiskChanged(const QString&)));
(2)通過設定定時器,每隔十秒檢測所有磁碟容量並展示出來
定義定時器,每隔10檢測裝置所有磁碟一次
connect(m_timer, SIGNAL(timeout()), this, SLOT(slotDiskChanged()));
(3)通過UDP傳送該裝置所有磁碟資訊
QByteArray datagram; QDataStream out(&datagram, QIODevice::WriteOnly); out.setVersion(QDataStream::Qt_5_5); out << /*QDateTime::currentDateTime() << */dTotalBytes << dFreeBytes; //qDebug() << QDateTime::currentDateTime(); QHostAddress address; address.setAddress("192.168.1.67"); udpSocket->writeDatagram(datagram, address, 5555); QThread::sleep(1);
二、篩選磁碟內特定檔案
- 遍歷所有磁碟
- 遍歷每個磁碟所有資料夾,直至資料夾沒有子節點(即檔案)
注:此時我們找的是指定檔案(test.txt)
根據字首fname <test> 來遍歷查詢 sfiles.baseName() ;
void DiskSend::findSpecialFile(QString strDir, QStringList fileName,QString fname)
{
QDir curdir(strDir);
curdir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
QFileInfoList curdirlist = curdir.entryInfoList();
foreach(QFileInfo sfiles, curdirlist)
{
QString sfilesname = sfiles.fileName();
if (sfiles.isDir() == true)
{
QString strFileName = sfiles.filePath();
findSpecialFile(strFileName, fileName,fname);
}
if (sfiles.isFile() == true)
{
QString base = sfiles.baseName() ;
if (fname.contains(base,Qt::CaseInsensitive))
{
sfileNamePath snew;
snew.strFileName = sfiles.fileName();
snew.strFilePath = sfiles.filePath();
g_sfnp.append(snew);
ui.lineEdit_2->setText(snew.strFilePath);
}
}
}
//return s;
}
三、篩選磁碟內指定檔案
注:此時我們找的是特定檔案(.txt),所有 .txt 型別檔案
根據字尾fileName <*.txt> 來遍歷查詢 QString ext = "*." + sfiles.suffix();
void DiskSend::findSpecialFile(QString strDir, QStringList fileName,QString fname)
{
QDir curdir(strDir);
curdir.setFilter(QDir::AllEntries | QDir::NoDotAndDotDot);
QFileInfoList curdirlist = curdir.entryInfoList();
foreach(QFileInfo sfiles, curdirlist)
{
QString sfilesname = sfiles.fileName();
if (sfiles.isDir() == true)
{
QString strFileName = sfiles.filePath();
findSpecialFile(strFileName, fileName,fname);
}
if (sfiles.isFile() == true)
{
QString ext = "*." + sfiles.suffix();
if (fileName.contains(ext ,Qt::CaseInsensitive))
{
sfileNamePath snew;
snew.strFileName = sfiles.fileName();
snew.strFilePath = sfiles.filePath();
g_sfnp.append(snew);
ui.lineEdit_2->setText(snew.strFilePath);
}
}
}
//return s;
}
總結
檔案路徑 :fileInfo.filePath();
檔案全名稱:fileInfo.fileName();
檔案字首:fileInfo.baseName();
檔案字尾:fileInfo.suffix();
檔案是否存在:fileInfo.exists();
檔案大小:fileInfo.size();
是否是檔案:fileInfo.isFile();
是否是目錄:fileInfo.isDir();
是否是連線符:fileinfo.isSymLink();