Qt 文件与目录

QFile

  • 用于读取和写入文件的接口
  • QIODevice -> QFileDevice -> QFile
  • QFile 是一种输入、输出设备,用于读写文本,二进制文本和资源
  • QFile 可以单独使用,也可以与 QTextStream,QDataStream 一起使用

创建 QFile

  • argc 参数的数量
  • argv 参数列表,第一个参数为程序名
  • QFile f( filename )
  • f.fineName()

读取文件

  1. 打开文件
  2. 创建输入文件流
  3. 从流中读取数据

QTextStream 可以在 QIODevice,QByteArray 和 QString 上操作。可以方便的读写单词,行和数字。支持格式设置

#include <QFile>
#include <QDebug>

void readFile()
{
    QFile f("words.txt");

    // 打开文件并确认打开成功
    if (!f.open(QIODevice::ReadOnly))
    {
        qWarning() << "Cannot open file for reading";
        return;
    }

    // 创建输入文件流
    QTextStream instream(&f);

    // 从流中读取数据
    QString line;
    while (!instream.atEnd()) {
        line = instream.readLine();
        qDebug() << line;
    }
}

写入文件

  1. 打开文件,没有的话会自动创建
  2. 创建输出文件流
  3. 使用写入操作符写入改流
void writeFile()
{
    QFile f("names.txt");

    // 打开文件并确认打开成功
    if (!f.open(QIODevice::WriteOnly))
    {
        qWarning() << "Cannot open file for writing";
        return;
    }

    // 创建输出文件流
    QTextStream outstream(&f);

    // 向流中写入数据
    outstream << "张三" << Qt::endl;
    outstream << "李四" << Qt::endl;
    outstream << "王五" << Qt::endl;
}

拷贝文件

  • QFile::copy( src, dest )
  • 不需要创建 QFile 和打开文件
void copyFile()
{
    QString src = "names.txt";
    if (!QFile(src).exists())
    {
        qWarning() << "The source file does not exist";
        return;
    }

    QString dest = "new_names.txt";
    // 不需要创建 QFile 和打开文件
    QFile::copy(src, dest);
}

QDir

  • 对目录结构及其内容的访问

获取目录中的文件信息

  • QDir dir;
  • dir.setFilter(); // 设置文件过滤
  • dir.setSorting(); // 设置文件排序
  • dir.entryInfoList(); // 返回 QFileInfoList
  • QFileInfoList 等同于 QList<QFileInfo>
  • QString 的 arg() 方法中,第二个参数为对其长度,正数表示右对齐,负数表示左对齐
void getFiles()
{
    QDir dir;
    dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    dir.setSorting(QDir::Size | QDir::Reversed);

    QFileInfoList list = dir.entryInfoList();

    qDebug() << " Bytes Filenames";
    for (auto& fileinfo : list) {
        qDebug() << QString("%1 %2").arg(fileinfo.size(), -10).arg(fileinfo.fileName());
    }
}

目录操作

  • dir.mkdir( dirname );
  • dir.exists( dirname );
  • dir.rename( oldname, newname );
  • dir.mkpath( path); // 例如 "temp/newdir"
void dirOperation()
{
    QDir dir;
    if (dir.mkdir("mydir"))
    {
        qDebug() << "mydir is successfully created";
    }

    dir.mkdir("mydir2");
    if (dir.exists("mydir2"))
    {
        dir.rename("mydir2", "newdir");
    }

    dir.mkpath("temp/subdir");
}

特殊目录(静态函数)

QDirQString
current()currentPath()
home()homePath()
root()rootPath()
temp()tempPath()
  • QDir::setCurrent( QString path );
  • QCoreApplication::applicationDirPath(); // 可执行文件目录
  • QDir::drives(); // 根目录列表
void commonDirs()
{
    qDebug() << QDir::currentPath();
    qDebug() << QDir::homePath();
    qDebug() << QDir::rootPath();
    qDebug() << QDir::tempPath();

    qDebug() << QDir::drives();
}

QFileInfo

  • 独立与系统的文件信息,包括文件的名称和在文件系统的位置,访问时间,修改时间,权限和文件所有权

获取文件信息

  • QFileInfo fileInfo( filename );
  • fileInfo.lastRead();
  • fileInfo.lastModified();
void readRecord()
{
    QFileInfo fileinfo("text.txt");

    QDateTime last_read = fileinfo.lastRead();
    QDateTime last_modified = fileinfo.lastModified();

    qDebug() << "Last read:" << last_read.toString();
    qDebug() << "Last modified:" << last_modified.toString();
}

列出文件内容

  • dir.filter(); // 当前已经应用的 filters
  • QDirIterator it(dir); // 注意,要包含头文件 QDirIterator
  • fileInfo = it.nextFileInfo();
  • 使用迭代器会让 dir.setSorting() 失效
void listDirContent()
{
    QDir dir;
    dir.setFilter(QDir::Files | QDir::AllDirs);
    dir.setFilter(dir.filter() | QDir::NoDotAndDotDot);

    dir.setSorting(QDir::Size | QDir::Reversed);  // 使用迭代器会让排序失效

    qDebug() << QString("Filename").leftJustified(30).append("Bytes");

    QDirIterator it(dir);

    while (it.hasNext())
    {
        QFileInfo fileinfo = it.nextFileInfo();
        QString str = fileinfo.fileName().leftJustified(30);

        qDebug() << str << fileinfo.size();
    }
}