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类。

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 新建文件夹

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 复制文件夹中内容

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 重命名文件夹

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 移除文件夹

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/610864.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

螺栓扭矩如何设计?——SunTorque智能扭矩系统

螺栓扭矩设计的大小是一个涉及工程实践的重要问题,它直接关系到螺栓连接的紧固质量和安全性。螺栓扭矩是工程领域中常用的一个概念,用来描述螺栓在连接过程中所需的旋转力矩。正确的螺栓扭矩可以确保螺栓和螺母之间的紧密连接,避免由于松动而…

Java入门基础学习笔记10——变量

变量的学习路径: 认识变量->为什么要用变量?->变量有啥特点?->变量有啥应用场景? 什么是变量? 变量是用来记住程序要处理的数据的。 变量的定义格式: 数据类型 变量名称 数据; 数…

C语言/数据结构——(用双链表实现数据的增删查改)

一.前言 嗨嗨嗨,大家好久不见!前面我们已经通过数组实现数据的增删查改、单链表实现数据的增删查改,现在让我们尝试一下使用双链表实现数据的增删查改吧! 二.正文 如同往常一样,对于稍微大点的项目来说,…

2024洗地机选购指南 | 怎么选洗地机不会被坑?

家里的地板总是需要打扫,但工作忙碌的我们往往没有足够的时间来打理。洗地机不仅能够帮助我们节省宝贵的时间,还能让我们的家变得一尘不染。今天,笔者将为大家讲讲挑选洗地机的技巧,告诉大家怎么挑选洗地机不会被坑,顺…

解锁楼宇自动化新维度西门子Insight+BACnet IP I/O控制器

数字城市的楼宇自动化已不再是一个遥不可及的概念,而是成为了现代建筑的标配。特别是在大型商业综合体、高端写字楼和公共设施中,高效的楼宇管理系统是确保环境舒适度与能源效率的关键。当提及楼宇自动化领域的佼佼者,西门子Insight楼宇自动化…

【洛谷】动态规划之最长公共子序列

前言: 本系列目的是记录日常所刷的题,有的是自己想出来的题,有的是看了大佬题解后想明白的题 题目 P1439 【模板】最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前提: 两个排列都是1到n的排列,说…

如何使用Vite快速构建vue项目

1、在自己定义的目录下打开cmd命令窗口:如文件夹目录上面输入cmd回车就可以打开 2、检查 node环境:通过node --version看版本号表示安装好了 3、 使用Vite 快速构建Vue项目 npm init vitelatest qiuqiu.admin 注意:如何你电脑没有装vite首…

《2024网络安全报告》中文版

Check Point发布了《2024 年网络安全报告》,Check Point Research 对网络攻击数据(包括所有地区和全球的统计数据)进行了全面分析,揭示了不断变化的网络威胁形势。 ● 去年,全球 1/10 的机构遭遇勒索软件攻击尝试&a…

QTday5

目录 网络聊天室服务器 网络聊天室客户端 学生管理系统 网络聊天室服务器 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//实例化一个tcp服务器sernew QTcpSe…

【SpringBoot记录】自动配置原理(2):自动配置的案例说明

案例说明 通过前面案例可以很明显感受到,SpringBoot除了做了依赖管理,还帮我们做了一些常规的配置,下面举例详细说明。 tomcat 项目可以直接启动,不需要任何配置,通过上一节发现引入了启动器中引入了spring-boot-st…

Python之数据分析基础

导言: “21世纪的竞争是数据的竞争,谁掌握数据,谁就掌握未来”。如何将大量看似杂乱无章的数据进行聚合,并发现潜在的规律也变得越来越重要。本文将先说明数据分析的步骤,再通过python完成实例数据的处理、分析最终展…

【初阶数据结构】顺序表OJ题讲解

前言 📚作者简介:爱编程的小马,正在学习C/C,Linux及MySQL。 📚本文收录与初阶数据结构系列,本专栏主要是针对时间、空间复杂度,顺序表和链表、栈和队列、二叉树以及各类排序算法,持…

PyTorch 图像篇

计算机视觉技术是一门包括计算机科学与工程、神经生理学、物理学、信号处理、认知科学、应用数学与统计等多学科的综合性科学技术, 是人工智能的一个重要分支, 目前在智能安防、自动驾驶汽车、医疗保健、生成制造等领域具有重要的应用价值。 计算机视觉…

常用控件(一)

常用控件 一 按钮类控件QPushButtonQRadioButtonQCheckBox 按钮类控件 QPushButton 使用QPushButton表示一个按钮,这是我们当前最熟悉的一个控件了; QPushButton继承自QAbstractButton,这个类是个抽象类,是其他按钮类的父类; QAbstractButt…

anaconda虚拟环境pytorch安装

1.先创建conda的虚拟环境 conda create -n gputorch python3.102.激活刚刚创建好的虚拟环境 conda activate gputorch3.设置镜像源 这一步是后面安装pytorch相关包所需要的来源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple4.查看电脑的显卡…

跨界内容营销:Kompas.ai如何帮助你的品牌打破行业边界

在当今多元化的市场环境中,跨界营销已成为品牌拓展影响力和用户基础的重要策略。通过跨界合作,品牌能够打破行业界限,创造独特的用户体验,从而提升品牌形象和市场竞争力。本文将深入分析跨界营销的作用,详细介绍Kompas…

SliderCaptcha滑块验证码功能

SliderCaptcha滑块验证码功能 资源文件及文档&#xff1a;https://gitee.com/LongbowEnterprise/SliderCaptcha <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><…

mysql 其他类型转换为BIT

看官网说明,BIT没什么特殊之处。但实际操作却不能将任何其他类型字段转为BIT,下面两个都报语法错误 CAST(column AS BIT(1)) AS aa , CAST(column AS BIT) AS bb, BIT value则模式是VARBINARY b1 as cc, -- cc为VARBINARY类型 下面是《高性能MySQL(第四版)》中关于BIT类型的…

cPanel中如何卸载已安装的SSL证书

我使用的Hostease的Linux虚拟主机产品默认带普通用户权限的cPanel面板&#xff0c;由于临时搭建了一个测试的个人的纯静态的网站&#xff0c;不想要安装SSL证书&#xff0c;但是据这边了解HosteaseLinux虚拟主机是只要域名解析指向主机IP&#xff0c;并且绑定到主机&#xff0c…

centos7.9升级4.19内核

centos默认的内核版本是3.10 通过命令 uname -a 输出系统的详细信息 在部署k8s集群时使用默认的3.10版本的内核&#xff0c;容易出各种奇奇怪怪的问题、可以理解为docker和k8s与该内核版本不兼容&#xff0c;所以在部署k8s集群时&#xff0c;务必要升级内核&#xff0c;这里…
最新文章