Qt总结之三:磁盘文件操作、遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(三)

本文介绍了一种实现磁盘容量实时监测的方法,并详细展示了如何筛选特定或指定类型的文件。利用GetDiskFreeSpaceEx()函数获取磁盘总容量及可用空间,通过QComboBox和定时器实现动态显示。此外,还提供了遍历磁盘查找特定文件(如test.txt)或指定类型文件(如.txt/.png)的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

本节内容主要包括磁盘容量检测、磁盘内指定或特定文件的操作

话不多说,先上效果图

共分为两个部分,第一部分是检测磁盘容量,第二部分是筛选磁盘内指定文件(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();

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值