話(huà)不多說(shuō),直接上代碼。個(gè)人理解的注釋?zhuān)瑓⒖季托?/p>
1,選擇目錄,獲取目錄下文件的絕對路徑
QString filepath = QFileDialog::getExistingDirectory(this, QStringLiteral("選擇目錄"),
FILEPATH); // 選擇目錄,設置對話(huà)框標題,FILEPATH是目錄默認路徑的宏定義
ui.lineEdit_FilePath->setText(filepath); // 將選擇的目錄路徑顯示在控件上
QDir dir(filepath); // 創(chuàng )建dir目錄對象
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks); // 實(shí)現對文件的過(guò)濾
dir.setSorting(QDir::Size | QDir::Reversed); // 實(shí)現對文件輸出的排序
QFileInfoList list = dir.entryInfoList(); // 存放文件信息列表
QStringList filelist; // 存放文件路徑的列表
for (int i = 0; i < list.size(); ++i) // 循環(huán)讀取文件信息列表的信息
{
QFileInfo fileinfo = list.at(i); // 獲取單個(gè)文件信息
QString suffix = fileinfo.suffix(); // 獲取單個(gè)文件的后綴名
if (QString::compare(suffix, QString("VAR"), Qt::CaseInsensitive) == 0) // 篩選后綴
名為VAR的文件
{
QString tmp_path = fileinfo.absoluteFilePath(); // 保存單個(gè)VAR文件的路徑
filelist.append(tmp_path); // 將單個(gè)VAR文件的路徑添加到文件路徑列表
}
}
2,有了文件名的絕對路徑列表,我們就可以根據絕對路徑開(kāi)始打開(kāi)文件獲得屬性,讀取內容
if (filelist.isEmpty()) // 如果選擇的目錄沒(méi)有VAR文件則返回
{
return;
}
int maxpoint; // 記錄文件內容中記載的文件行數
QString filename; // 記錄文件內容中記載的文件名
QByteArray filearray; // 字節數組用于接收讀取文件的返回值
wchar_t fileaddr[21] = L""; // 寬字符地址數組,用于提取文字
int filenum = filelist.count(); // 記錄文件路徑列表有多少個(gè)文件路徑
ui.tableWidget->setRowCount(filenum); // 有多少個(gè)文件路徑就創(chuàng )建多少行表格
for (int i = 0; i < filenum; i++)
{
QFile file(filelist[i]); // 根據文件路徑打開(kāi)文件
if (!file.open(QIODevice::ReadOnly)) // 文件打開(kāi)失敗則返回
{
return;
}
QFileInfo flashname(filelist[i]); // 創(chuàng )建文件屬性對象
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個(gè)字節到8*22是內部文件名地址,每8個(gè)字節地址取一個(gè)文字
fileaddr[j] = (wchar_t)PMC_Int64ToInt(*((int64*)(filearray.data() + 8 * (3 + j))));
}
filename = QString::fromWCharArray(fileaddr); // 將寬字符轉為QString類(lèi)型
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(); // 關(guān)閉文件
}
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.最后再看一下程序吧

聯(lián)系客服