文件夹操作
QDir
类具有处理目录的方法。
// dirs.cpp
#include <QTextStream>
#include <QDir>
int main(void) {
QTextStream out(stdout);
QDir dir;
// mkdir()用于创建新文件,成功过返回true
if (dir.mkdir("mydir")) {
out << "mydir successfully created" << endl;
}
dir.mkdir("mydir2");
// exists()方法判断文件夹是否存在
// rename()方法用于对文件夹进行重命名
if (dir.exists("mydir2")) {
dir.rename("mydir2", "newdir");
}
// mkpath()用于创建一个文件夹和这个文件夹的父文件夹
dir.mkpath("temp/newdir");
}
在这个例子中,我们介绍了四种处理目录的方法。
输出结果为:
$ ./dirs
mydir successfully created
$ tree
.
├── dirs
├── dirs.cpp
├── dirs.o
├── dirs.pro
├── Makefile
├── mydir
├── newdir
└── temp
└── newdir
4 directories, 5 files
特殊路径
文件系统中有一些特殊的路径;例如主目录或根目录。QDir
类用于获取系统中的特殊路径。
// special_paths.cpp
#include <QTextStream>
#include <QDir>
int main(void) {
QTextStream out(stdout);
// 打印当前目录
out << "Current path:" << QDir::currentPath() << endl;
// 打印主目录
out << "Home path:" << QDir::homePath() << endl;
// 打印临时目录
out << "Temporary path:" << QDir::tempPath() << endl;
// 打印根目录
out << "Rooth path:" << QDir::rootPath() << endl;
}
该示例打印四条特殊路径。
输出结果为:
$ ./special_paths
Current path:/home/zhangsl/Desktop/QtBase/FileAndDir/special_paths
Home path:/home/zhangsl
Temporary path:/tmp
Rooth path:/
文件路径
一个文件由其名称和路径标识;路径由文件名,基本名称和后缀组成。
// file_path.cpp
#include <QTextStream>
#include <QFileInfo>
int main(int argc, char *argv[]) {
QTextStream out(stdout);
if (argc != 2) {
out << "Usage: file_times file" << endl;
return 1;
}
QString filename = argv[1];
// 文件路径使用QFileInfo类来标识。
QFileInfo fileinfo(filename);
// absoluteFilePath()返回文件的绝对路径
QString absPath = fileinfo.absoluteFilePath();
// baseName()返回基本名称-没有路径的文件的名称
QString baseName = fileinfo.baseName();
// completeBaseNme()返回完整的基本名称-文件中的所有字符直到最后一个点字符(但是不包含这个点字符)。
QString compBaseName = fileinfo.completeBaseName();
// fileName()返回文件名,包括基本名称和扩展名。
QString fileName = fileinfo.fileName();
// suffix()返回文件结尾,它由最后一个点字符(不包括这个点字符)后文件名中的所有字符组成。
QString suffix = fileinfo.suffix();
// 一个文件结尾可能由几个部分组成,completeSuffix()范围第一个点字符(不包括这个字符)后文件名中的所有字符。
QString compSuffix = fileinfo.completeSuffix();
out << "Absolute file path: " << absPath << endl;
out << "Base name: " << baseName << endl;
out << "Complete base name: " << compBaseName << endl;
out << "File name: " << fileName << endl;
out << "Suffix: " << suffix << endl;
out << "Whole suffix: " << compSuffix << endl;
}
在这个例子中,我们使用几种方法来打印给定文件名的文件路径。
输出结果为:
$ ./file_path ~/Downloads/qt-opensource-linux-x64-5.10.0.run
Absolute file path: /home/zhangsl/Downloads/qt-opensource-linux-x64-5.10.0.run
Base name: qt-opensource-linux-x64-5
Complete base name: qt-opensource-linux-x64-5.10.0
File name: qt-opensource-linux-x64-5.10.0.run
Suffix: run
Whole suffix: 10.0.run
文件权限
文件系统中的文件具有保护系统。文件被赋予标志,确定谁可以访问和修改它们。QFile::permissions()
方法返回所讨论文件的 OR-ed标志的枚举。
// permissions.cpp
#include <QTextStream>
#include <QFile>
int main(int argc, char *argv[]) {
QTextStream out(stdout);
if (argc != 2) {
out << "Usage: permissions file" << endl;
return 1;
}
QString filename = argv[1];
// 通过QFile::permissions()方法获得许可标志的枚举。
QFile::Permissions ps = QFile::permissions(filename);
// 这个字符串是基于给定的权限动态构建的。
QString fper;
// 我们使用&运算符来确定返回的枚举是否由QFile::ReadOwner标志组成。
if (ps & QFile::ReadOwner) {
fper.append('r');
} else {
fper.append('-');
}
if (ps & QFile::WriteOwner) {
fper.append('w');
} else {
fper.append('-');
}
if (ps & QFile::ExeOwner) {
fper.append('x');
} else {
fper.append('-');
}
if (ps & QFile::ReadGroup) {
fper.append('r');
} else {
fper.append('-');
}
if (ps & QFile::WriteGroup) {
fper.append('w');
} else {
fper.append('-');
}
if (ps & QFile::ExeGroup) {
fper.append('x');
} else {
fper.append('-');
}
if (ps & QFile::ReadOther) {
fper.append('r');
} else {
fper.append('-');
}
if (ps & QFile::WriteOther) {
fper.append('w');
} else {
fper.append('-');
}
if (ps & QFile::ExeOther) {
fper.append('x');
} else {
fper.append('-');
}
out << fper << endl;
}
该示例为给定文件生成类似unix的权限列表。有可能的用户的种类:所有者,文件所属的组,以及其他被称为其他用户的用户。前三个位置属于文件的所有者,中间的三个位置属于文件所属的组,最后三个位置属于其他文件。有四种权限:读取(r),写入或修改(w),执行(x)以及没有权限( - )。
输出结果为:
$ ./permissions Makefile
rw-r--r--
文件所有者和用户组有权读取文件并对其进行修改。其他用户有权阅读该文件。由于该文件不是可执行文件,因此无权执行该文件。
列出文件夹内容
在下面的例子中,我们显示给定目录的内容。
// list_dir.cpp
#include <QTextStream>
#include <QFileInfo>
#include <QDir>
int main(int argc, char *argv[]) {
QTextStream out(stdout);
if (argc != 2) {
qWarning("Usage: list_dir directory");
return 1;
}
QString directory = argv[1];
QDir dir(directory);
if (!dir.exists()) {
qWarning("The directory does not exist");
return 1;
}
// setFilter()方法指定entryInfoList()方法应该返回的文件类型。
dir.setFilter(QDir::Files | QDir::AllDirs);
// setSorting()方法指定entryInfoList()方法使用的排序顺序。
dir.setSorting(QDir::Size | QDir::Reversed);
// entryInfoList()方法返回目录中所有文件和目录的QFileInfo对象列表,
// 并通过过滤和排序方法进行过滤和排序。
// QFileInfoList是QList<QFileInfo>的同义词。
QFileInfoList list = dir.entryInfoList();
int max_size = 0;
foreach (QFileInfo finfo, list) {
QString name = finfo.fileName();
int size = name.size();
if (size > max_size) {
max_size = size;
}
}
// 给列的长度增加了两个空格。
int len = max_size + 2;
// 这里打印列名。leftJustified() 方法返回给定大小的字符串,
// 其字符串左对齐,并由填充字符填充(默认为空格)。
out << QString("Filename").leftJustified(len).append("Bytes") << endl;
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
QString str = fileInfo.fileName().leftJustified(len);
str.append(QString("%1").arg(fileInfo.size()));
out << str << endl;
}
return 0;
}
要列出目录的内容,我们使用QDir
类及其entryInfoList()
方法。文件列表按照其大小进行反向排序并排列整齐。有两列:第一列包含文件名,第二列是文件大小。
foreach (QFileInfo finfo, list) {
QString name = finfo.fileName();
int size = name.size();
if (size > max_size) {
max_size = size;
}
}
我们浏览列表并确定最大文件名大小。这个信息是需要整齐地组织输出的。
for (int i = 0; i < list.size(); ++i) {
QFileInfo fileInfo = list.at(i);
QString str = fileInfo.fileName().leftJustified(len);
str.append(QString("%1").arg(fileInfo.size()));
out << str << endl;
}
我们浏览文件列表并打印它们的名称和大小。第一列是左对齐的,并根据需要填充空格;第二列是简单的追加和行的结尾。
输出结果为:
$ ./list_dir .
Filename Bytes
list_dir.pro 919
list_dir.cpp 1092
.. 4096
. 4096
list_dir.o 10776
list_dir 19432
Makefile 48223