QTextStream读写文件

本文介绍了在QT项目中遇到的问题:如何高效处理注册表数据的显示。为了解决每次双击节点都需要重新请求数据导致的性能问题,作者利用QTextStream实现了文件的读写功能,将已加载的注册表键值保存到本地文件,从而在下次双击同一节点时直接读取,避免了重复请求,提高了客户端响应速度。

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

今天在项目中碰到了一个问题,就是将被控主机注册表发送到控制端来显示,要尽可能模拟真实的注册表结构和风格。注册表分为两块,树状图和右边的表格视图是同步变化的,即双击一个树节点(子键),相应的树的子节点(子键)就会被加载,同时该节点(子键)对应的键值名、键值类型、键值也要在表格视图上显示出来,并且,当再双击另一个节点时,整个表格的数据要被新的子键的相应键值覆盖。虽然树状图的节点可以暂时保存在内存里,但表格视图上的数据却没办法保存,每次双击一个已经被展开过的节点都要重新请求键值,严重减缓了客户端的速度,这时想到了把每个已经加载过子键对应的表格视图键值都保存在本地文件中,然后再次双击该节点时,就可以直接从本地文件中读取,然后显示在表格视图上,这样省去了重复向远程被控端请求的时间。

然而用QT读写文件,我还刚接触,所以在查询了一些资料后,尝试着、并且坚持着把读写文件给成功完成了。成功的实现了不用重复请求远控端的方法。

QT中的读和写文件的方式也有很多,这是我用到的写和读(QTextStream):

写:

/*
 *	将注册表子键值写进文件
 */
void RegistryWindow::writeIntoFileOfKeyValueTable(QString keyName,QString name,QString type,QString data)
{
	//创建文件夹
	if (!QDir::current().exists("keyValueTable"))
	{
		QDir::current().mkdir("keyValueTable");
	}


	QString re = keyName.replace(QRegExp("\\\\"),"@"); //正则表达式,@来代替分隔


	//创建文件
	QFile file("./keyValueTable/" + re +".txt");


	if(!file.open(QIODevice::WriteOnly|QIODevice::Append))
	{
		QMessageBox::information(this,QStringLiteral("打开文件失败!"),file.errorString());
	}


	QTextStream fileOut(&file);


	// fileOut.setCodec("UTF-8");  //unicode UTF-8  ANSI


	fileOut << name << "$" << type << "$" << data << "\n";


	file.flush();


	file.close();
}


读:

/*
 *	将文件中的注册表键值读出,并显示到注册表键值表格上
 */
void RegistryWindow::readFromFileOfKeyValueTable(QString keyName)
{
	QString re = keyName.replace(QRegExp("\\\\"),"@");

	//创建文件
	QFile file("./keyValueTable/" + re +".txt");

	//打开文件
	if(!file.open(QIODevice::ReadOnly))
	{
		QMessageBox::information(this,QStringLiteral("打开文件失败!"),file.errorString());
	}

	QTextStream fileIn(&file);
	QString str = fileIn.readLine(0);
	while (str.contains("$"))
	{
		qDebug() << str;
		QStringList strList = str.split("$");

		QTextCodec *codec = QTextCodec::codecForLocale();//显示汉字的

		//最终要存储的键值
		QIcon *resultValueIcon;
		QString resultValueName = strList.at(0);
		QString resultValueType = strList.at(1);
		QString resultValueData = strList.at(2);

		//REG_DWORD类型的键值
		if (QString(resultValueType).contains("REG_DWORD"))
		{
			resultValueIcon = new QIcon(":/Images/Resources/reg_011110.png");
		}
		//REG_BINARY类型的键值
		else if (QString(resultValueType).contains("REG_BINARY"))
		{
			resultValueIcon = new QIcon(":/Images/Resources/reg_011110.png");
		}
		//REG_SZ\REG_EXPAND_SZ\REG_MULTI_SZ类型的键值
		else
		{
			resultValueIcon = new QIcon(":/Images/Resources/reg_ab.png");
		}

		//键值名称
		QTableWidgetItem *itemName = new QTableWidgetItem;
		itemName->setIcon(*resultValueIcon);
		itemName->setText(resultValueName);
		//itemName->setText(codec->toUnicode(keyInfo.valueName));

		//键值类型
		QTableWidgetItem *itemType = new QTableWidgetItem;
		itemType->setText(resultValueType);

		//键值数据
		QTableWidgetItem *itemData = new QTableWidgetItem;
		itemData->setText(resultValueData);

		myTableWidget->setRowCount(myTableWidget->rowCount()+1);
		myTableWidget->setRowHeight(myTableWidget->rowCount()-1,20);//设置行高
		myTableWidget->setItem(myTableWidget->rowCount()-1,0,itemName);
		myTableWidget->setItem(myTableWidget->rowCount()-1,1,itemType);
		myTableWidget->setItem(myTableWidget->rowCount()-1,2,itemData);

		str = fileIn.readLine(0);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值