5、Qt—文件夹的使用小记1

开发平台:Win10 64位

开发环境:Qt Creator 13.0.0

构建环境:Qt 5.15.2 +MSVC2019 64位

一、需求及涉及相关类

在开发过程中,或多或少的都会操作到文件,比如配置文件,日志等生成复制操作,在Qt中实现文件夹的操作(创建、复制、重命名、移除)的类主要是这三个:QDir、QFile、QFileInfo。

|-----------|-------------------------------------------------------------------------------------|
| QDir | 主要是对文件夹的操作,新建个文件夹,删除个文件夹,判断文件夹存不存在等功能 |
| QFile | 主要是对文件进行操作(读写),比如判断每个文本文件存不存在,船舰一个文本文件之类的功能。 |
| QFileInfo | 兼顾文件夹和文件的操作,既可以实现QDir判断文件夹存不存在等操作,也可以实现QFile判断文件存不存在的操作。从名字上面也可以知道,它还提供了对文件的更详细的操作。 |

本篇文章更多的是对文件夹的操作,后续会更新对文件(QFile)的操作。

二、QDir

QDir类主要用于对文件夹的操作,在文件系统的开发中用的比较对,比如我们在win10中常用的在某某盘创建个文件夹,复制某个文件夹到其他盘或者其他文件夹下。对于qt开发,上面这些操作都离不开QDir类。

cpp 复制代码
QString QDir::path(); // 获取目录的路径
 
QStringList QDir::entryList(); // 获取目录中条目的名称列表
 
void QDir::setPath(const QString &path); // 给 QDir 设置一个新路径
 
bool QDir::cd(const QString &dirName); // 进入到指定目录
 
bool QDir::cdUp(); // 进入到父目录 cdUp() 等效于 cd("..")
 
bool QFileInfo::exists(); // 测试指定目录是否存在
 
bsolutePath(); // 获取目录的绝对路径
 
QString QDir::dirName(); // 获取目录名,通常返回绝对路径中的最后一个元素;如果 QDir 代表当前目录,会返回"."
 
bool QDir::mkdir(const QString &dirName); // 创建一个目录
 
bool QDir::rename(const QString &oldName, const QString &newName); // 重命名
 
bool QDir::rmdir(const QString &dirName); // 删除目录(删除文件用 remove())
 
isReadable(); // 测试目录的属性,是否可读
 
isRoot(); // 测试目录的属性,是否是根目录
 
void QDir::refresh(); // 重新读取目录的数据
 
uint QDir::count(); // 返回目录中的所有条目数
 
QFileInfoList QDir::entryInfoList(); // 获取一个 QFileInfo 对象的列表
 
bool QDir::isRelative(); // 判断 QDir 是否使用相对路径
 
bool QDir::isAbsolute(); // 判断 QDir 是否使用绝对路径
 
bool QDir::makeAbsolute(); // 将一个相对路径转换为绝对路径

注意:filePath()及absoluteFilePath()来获得QDir中指定文件的路径名,但这两个函数均不检查指定的文件是否存在;

2.1 新建文件夹

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    /********************/
    //dirName:需要带路径,或者前面加一个/,如果只是111的化,没什么效果
    QString dirName="f://111";
    QString dirName="/111";//会生成在项目所在的磁盘的第一级目录下

    CreateFolder(dirName);
    /********************/
}

//创建文件夹
void MainWindow::CreateFolder(QString folderPath)
{
    //创建文件夹
    QDir dir(folderPath);

    if (!dir.exists())
    {
        dir.mkdir(folderPath);
    }
}

2.2 复制文件夹中内容

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    /********************/

    QString sourceDir="/111";
    QString desDir="/222";
    CreateFolder(sourceDir);

    copyFolder(sourceDir,desDir,true);

    /********************/

}

///将源文件夹中的内容复制到目标文件夹中,并不是把源文件一起复制过去,
///比如上面将111文件夹复制222文件夹,并不会在222文件夹下面出现111文件夹
///而是出现111文件夹中的东西
/// \brief MainWindow::copyFolder
/// \param fromDir--源目录
/// \param toDir--目标目录
/// \param coverFileIfExist--如果存在是否覆盖
/// \return bool
///
bool MainWindow::copyFolder(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
    QDir sourceDir(fromDir);
    QDir targetDir(toDir);

    if (!targetDir.exists())
    {    //如果目标目录不存在,则进行创建
        if (!targetDir.mkdir(targetDir.absolutePath())) return false;
    }

    QFileInfoList fileInfoList = sourceDir.entryInfoList();
    foreach(QFileInfo fileInfo, fileInfoList)
    {
        if (fileInfo.fileName() == "." || fileInfo.fileName() == "..") continue;

        if (fileInfo.isDir())
        {    // 当为目录时,递归的进行copy
            if (!copyFolder(fileInfo.filePath(),
                            targetDir.filePath(fileInfo.fileName()),
                            coverFileIfExist))
                return false;
        }
        else
        {   //当允许覆盖操作时,将旧文件进行删除操作
            if (coverFileIfExist && targetDir.exists(fileInfo.fileName()))
            {
                targetDir.remove(fileInfo.fileName());
            }

            // 进行文件拷贝
            if (!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName())))
            {
                return false;
            }
        }
    }
    return true;
}

2.3 重命名文件夹

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    /********************/

    QString sourceDir="/111";
    QString desDir="/222";
    QString newDir="/1";
    CreateFolder(sourceDir);

    copyFolder(sourceDir,desDir,true);
    RenameFolder(sourceDir,newDir);
    /********************/

}

///
/// \brief MainWindow::RenameFolder
/// \param oldPath--原来文件夹路径
/// \param newPath--需要修改的文件夹路径,这个路径其实就是把最后一级换个名字
///
void MainWindow::RenameFolder(const QString oldPath, const QString newPath)
{
    //重命名文件夹
    QDir dirOld(oldPath);
    dirOld.rename(oldPath, newPath);
}

2.4 移除文件夹

cpp 复制代码
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    /********************/
    QString sourceDir="/111";
    QString desDir="/222";
    QString newDir="/1";
    CreateFolder(sourceDir);

    copyFolder(sourceDir,desDir,true);
    RenameFolder(sourceDir,newDir);

    RemoveFolder(sourceDir);
    RemoveFolder(desDir);
    RemoveFolder(newDir);
    /********************/

}

/// \brief MainWindow::RemoveFolder
/// \param dirPath
///
void MainWindow::RemoveFolder(const QString dirPath)
{
    //移除文件夹
    QDir dirItem(dirPath);
    dirItem.removeRecursively();
}

注意:其中在文件夹及文件的操作中,要明确一些变量名,比如filename,或者filepath这种,其实只要明白,我们给文件夹及文件的参数是路径地址就可以。

三、参考文献

3.1 QT中QFile、QFileInfo、QDir的常用函数_qt qfileinfo函数-CSDN博客

3.2 QDir类及其用法总结-CSDN博客

相关推荐
xcyxiner10 小时前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz5 天前
QML Hello World 入门示例
qt
xcyxiner8 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner9 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner9 天前
DicomViewer (添加模型类)3
qt
xcyxiner10 天前
DicomViewer (目录调整) 2
qt
xcyxiner10 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能12 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G12 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt
森G12 天前
77、线程池原理和实现------服务器源码解析----云视频服务项目
服务器·c++·qt