Qt中关于文件夹或文件的操作

1 Qt文件操作

Qt中对于文件操作,利用一个例子讲明白,就说通过按钮选择一个文件并将其内容打开到文本框中,注意:需要包含对应的头文件方可执行。

读文件的方式:

首先要得到这个要打开的文件的路径,先默认打开的界面是桌面,选择路径时需要判断是否选中,这个通过isEmpty这个函数进行判断,若没有选中则进行提示,这个利用QMessageBox进行提示。

但要注意的是,默认打开txt的编码格式为utf-8,否则无法打开。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//点击按钮 弹出对话框,选择文件
connect(ui->pushButton,&QPushButton::clicked,[=](){
QString filePath = QFileDialog::getOpenFileName(this,"打开文件","C:\\Users\\Administrator\\Desktop");
qDebug()<<filePath;

if(filePath.isEmpty())
{
QMessageBox::warning(this,"警告","文件路径不能为空");
return;
} else {
//将文件路径放入到 lineEdit中
ui->lineEdit->setText(filePath);

//将文件内容读取到 textEdit中
QFile file(filePath);

//指定打开方式
file.open(QIODevice::ReadOnly);

//Qt默认支持格式是utf-8
QByteArray array;

ui->textEdit->setText(array);
file.close();

}
}

若不是utf-8的格式,也可以通过更改编码格式的方式,正确打开该文件,以gbk格式为例,同时打开方式也可以按行打开,通过atEnd函数来判断是否到了文件尾。但此时也就无法打开utf-8格式的文本了,所以需要通过if-else语句来选择何种编码格式,对应何种打开方式,而编码方式可以取出文本的第一个字符来看看进行判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//文本编码格式类
QTextCodec * codec = QTextCodec::codecForName("gbk");
//将文件内容读取到 textEdit中
QFile file(filePath);

//指定打开方式
file.open(QIODevice::ReadOnly);

QByteArray array;
//array = file.readAll();

array = file.readLine();

while(!file.atEnd())
{
array += file.readLine();
}

ui->textEdit->setText( codec->toUnicode(array) );
file.close();

写文件的方式:主要是通过append进行追加文本,否则将会替换打开文本中的内容。

1
2
3
4
// 写文件
file.open(QIODevice::Append);//追加的方式写文件
file.write("啊啊啊");
file.close();

读取文本的信息:其中最为重要的是suffix函数,它可以得到文件的后缀名,通过判断后缀名来选择打开的文件的方式。

1
2
3
4
//读取文件
QFileInfo info(filePath);
qDebug()<<"文件的后缀名:"<<info.suffix()<<"文件大小"<<info.size();
qDebug()<<"创建日期:"<<info.created().toString("yyyy-MM-dd hh:mm:ss");

2 Qt获取文件夹下文件信息,排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include
#include

int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);

QString path = "......";
QDir dir(path);
dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
dir.setNameFilters(QStringList("*.xml"));
dir.setSorting(QDir::Size | QDir::Reversed | QDir::Name);

// 目录下的文件数量
qDebug()<< dir.count() <<Qt::endl;

QFileInfoList list = dir.entryInfoList();
std::cout << " Bytes Filename" << std::endl;
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
std::cout << qPrintable(QString("%1 %2").arg(fileInfo.size(), 10).arg(fileInfo.fileName()));

QFile file(fileInfo.absoluteFilePath());
if (!file.exists()){
qDebug()<<"文件不存在"<<Qt::endl;
return;
}

// 以只读方式打开文件
if(!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
qDebug()<<"文件打开失败"<<Qt::endl;
file.close();
return;
}

// 读取内容
QString sendstr = file.readAll();
QByteArray sendarr = sendstr.toUtf8();
file.close();
}

return 0;
}

递归遍历子目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
QFileInfoList GetFileList(QString path) {
QDir dir(path);
QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);

for(int i = 0; i != folder_list.size(); i++) {
QString name = folder_list.at(i).absoluteFilePath();
QFileInfoList child_file_list = GetFileList(name);
file_list.append(child_file_list);
}

return file_list;
}