1. 程式人生 > >Qt總結之三:磁碟檔案操作、遍歷資料夾和檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(三)

Qt總結之三:磁碟檔案操作、遍歷資料夾和檔案目錄,並過濾和獲取檔案資訊、字尾名、字首名(三)

前言

本節內容主要包括磁碟容量檢測、磁碟內指定或特定檔案的操作

話不多說,先上效果圖

共分為兩個部分,第一部分是檢測磁碟容量,第二部分是篩選磁碟內指定檔案(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);

二、篩選磁碟內特定檔案

  1. 遍歷所有磁碟
  2. 遍歷每個磁碟所有資料夾,直至資料夾沒有子節點(即檔案)

注:此時我們找的是指定檔案(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();