文件的检测和筛选

获取磁盘容量关键函数:

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;

//总计:xxGB
	ui.totalLabel->setText(QString::number(dTotalBytes, 'f', 3));
//剩余可用:xxGB
	ui.freeLabel->setText(QString::number(dFreeBytes, 'f', 3));
}

一、磁盘容量检测
该模块细分三个子模块
(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 来遍历查找 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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用说明 : 1、本程序可以作什么? 本程序功能分为两个部分: 一部分是:批量查找指定路径下的文件中的内容中,是否包含要查询的项目。并把查询出的内容分文件存储。 一部分是:将文本文件导入EXCEL中,可以将上一步查找的结果导入,也可以自己选择文件导入(支持多选)。 2、如何使用他? a、批量查找: 首先,在“读入位置”按钮处设置你所要读取的文件的存放位置,此时程序会自动读入此文件夹下所有文件,以供选择;其次,用“>>”或“>”将要读取的文件选入读取队列,当然如果选错了可以用“<<”或“<”删除队列,或者鼠标双击选中项删除;再次,点击“+”按钮,添加查找项目到查找项目列表,一次只可以添加一条,如需添加多条则需要重复添加操作;如果添加错误可以双击选中项删除或选中后点击“-”按钮。最后,点击“开始查找”,程序将会把查找结果输出保存到指定路径下面的output文件夹下面,你可以选择是否打开目录查看。如果需要查询的文件文件头,可以选择“保留文件首行”。 b、EXCEL导入: 首先,选择导入方式,导入方式分为“查询结果导入”和“新选文件导入”两种;当选择“查询结果导入”时,本程序将把“读入位置”处“output”文件夹文件批量导入EXCEL。当选择“新选文件导入”时,本程序在点击“开始导入”时将弹出窗口,您可以自己选择需要导入文件(支持多选),导入EXCEL。其次,设置导入文件时的分割符,默认为“|”,本程序只支持按照分隔符导入。最后,点击“开始导入”按钮开始导入。 3、本程序不判断所查找的文件类型 由于本程序在读入文件时,并没有校验文件的内容和文件类型,因此本程序会读取用户所选择的任意文件,即使此文件是二进制格式的。不论是查询或者是导入功能都是这样。本程序将按行读取所选择的文件(或者有换行符的),在读取完文件后,无论是否找到,都会创建和源文件相同类型的文件,即使是.exe或.rar(一般是打不开的),文件名存储为“output”+原文件名。即使没有找到任何相匹配的内容,本程序也会创建文件,这时后文件大小是0字节,可以按照大小排列看到。 4、请使用“清除文件”按钮及时清除查询结果 程序在查询和创建文件的过程中,不会判断是否已经执行过查询操作。如果已经执行过查询操作,“output”文件夹下就会存在查询出的文件,当再次执行查询时,本程序会在已存在的文件后追加查询结果。这样就会出现重复的记录或内容。因此,当需要多次查询时,每次查询前需要点击“清空文件”按钮删除output文件夹,才能保证查找的准确。 5、本程序不会判断运行的环境,因此在运行过程中可能会有些未知的错误 本程序在win7环境,vs2012,Netframe4.0下编译通过。本程序支持winxp及以上操作系统。执行EXCEL导入的时候,需要安装Office。Office的版本在2003以上就可以。但是不同我Office版本对导入性能,有一定的影响。Excel2003,最多256列,即2的8次方,最多65536行,即2放入16次方; Excel2007及以上版本,最多16384列,即2的14次方,最多1048576行,即2的20次方。因此如果需要导入的单个文件的行数或者列数,超过了所安装Office版本的最多行列数,程序将会报错!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值