话不多说,直接上代码。个人理解的注释,参考就行
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.最后再看一下程序吧
|