分享

QT读取文件夹下的特定文件_qt打开文件夹路径并读取文件

 wuxinit_ 2023-05-14 发布于湖北

        话不多说,直接上代码。个人理解的注释,参考就行

1,选择目录,获取目录下文件的绝对路径

    QString filepath = QFileDialog::getExistingDirectory(this, QStringLiteral("选择目录"), 
                       FILEPATH); // 选择目录,设置对话框标题,FILEPATH是目录默认路径的宏定义
	ui.lineEdit_FilePath->setText(filepath); // 将选择的目录路径显示在控件上
	QDir dir(filepath); // 创建dir目录对象
	dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); // 实现对文件的过滤
	dir.setSorting(QDir::Size | QDir::Reversed); // 实现对文件输出的排序
	QFileInfoList list = dir.entryInfoList(); // 存放文件信息列表
	QStringList filelist; // 存放文件路径的列表
	for (int i = 0; i < list.size(); ++i) // 循环读取文件信息列表的信息
	{
		QFileInfo fileinfo = list.at(i); // 获取单个文件信息
		QString suffix = fileinfo.suffix(); // 获取单个文件的后缀名
		if (QString::compare(suffix, QString("VAR"), Qt::CaseInsensitive) == 0) // 筛选后缀        
                                                                              名为VAR的文件
		{
			QString tmp_path = fileinfo.absoluteFilePath(); // 保存单个VAR文件的路径
			filelist.append(tmp_path); // 将单个VAR文件的路径添加到文件路径列表
		}
	}

2,有了文件名的绝对路径列表,我们就可以根据绝对路径开始打开文件获得属性,读取内容

    if (filelist.isEmpty()) // 如果选择的目录没有VAR文件则返回
	{
		return;
	}

	int maxpoint; // 记录文件内容中记载的文件行数
	QString filename; // 记录文件内容中记载的文件名
	QByteArray filearray; // 字节数组用于接收读取文件的返回值
	wchar_t fileaddr[21] = L""; // 宽字符地址数组,用于提取文字
	int filenum = filelist.count(); // 记录文件路径列表有多少个文件路径
	ui.tableWidget->setRowCount(filenum); // 有多少个文件路径就创建多少行表格

	for (int i = 0; i < filenum; i++)
	{
		QFile file(filelist[i]); // 根据文件路径打开文件
		if (!file.open(QIODevice::ReadOnly)) // 文件打开失败则返回
		{
			return;
		}

		QFileInfo flashname(filelist[i]); // 创建文件属性对象
		ui.tableWidget->setItem(i, 0, new QTableWidgetItem(flashname.fileName())); // 就        外在文件名显示在控件上
		ui.tableWidget->item(i, 0)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // 外在文件名居中显示

		filearray = file.readAll(); // 一次性读取文件所有内容

		filename = ""; // 内部文件名先赋值为空
		for (int j = 0; j < 20; j++)
		{
			// 第8*3个字节到8*22是内部文件名地址,每8个字节地址取一个文字
			fileaddr[j] = (wchar_t)PMC_Int64ToInt(*((int64*)(filearray.data() + 8 * (3 + j))));
		}
		filename = QString::fromWCharArray(fileaddr); // 将宽字符转为QString类型
		ui.tableWidget->setItem(i, 1, new QTableWidgetItem(filename)); // 将内部文件名显示在控件上
		ui.tableWidget->item(i, 1)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // 内部文件名居中显示

		maxpoint = PMC_Int64ToInt(*((int64*)(filearray.data() + 8 * 23))); // 第8*23到8*24字节地址记录了文件行数
		ui.tableWidget->setItem(i, 2, new QTableWidgetItem(QString::number(maxpoint))); // 将文件行数显示在控件上
		ui.tableWidget->item(i, 2)->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter); // 文件行数居中显示

		file.close(); // 关闭文件
	}

3,清空表格控件行,再次读取其他目录先清空表格

    // 删除表格所有行,第一种方法
	int rowcount = ui.tableWidget->rowCount();
	for (int i = 0; i < rowcount; ++i)
	{
		ui.tableWidget->removeRow(0);
	}

	 删除表格所有行,第二种方法 
	//for (int i = ui.tableWidget->rowCount() - 1; i >= 0; --i)
	//{
	//	ui.tableWidget->removeRow(i);
	//}

4.最后再看一下程序吧

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多