Qt学习(15)——Qt5中的文件与文件夹(3)

文件夹操作

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值