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博客

相关推荐
Mr.Q1 小时前
Qt多边形填充/不填充绘制
qt
可峰科技2 小时前
斗破QT编程入门系列之二:认识Qt:编写一个HelloWorld程序(四星斗师)
开发语言·qt
7年老菜鸡4 小时前
策略模式(C++)三分钟读懂
c++·qt·策略模式
huanggang9827 小时前
在Ubuntu22.04上使用Qt Creator开发ROS2项目
qt·ros2
老秦包你会8 小时前
Qt第三课 ----------容器类控件
开发语言·qt
spygg9 小时前
Qt低版本多网卡组播bug
qt·组播·多网卡组播·qt5.7.0
码农客栈10 小时前
qt QWebSocketServer详解
qt
plmm烟酒僧11 小时前
Windows下QT调用MinGW编译的OpenCV
开发语言·windows·qt·opencv
Black_Friend11 小时前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
CSUC11 小时前
【Qt】QTreeView 和 QStandardItemModel的关系
qt