Qt使用QDir创建时间相关文件目录及遍历文件夹

1、在根目录下创建年月日格式文件夹

如在 /home/wen/Data根目录下创建以当前日期命名的文件夹(20230625);在日期命名文件夹下创建以当前时间命名的文件夹(092116)

QString save_path = "/home/wen/Data";	//根目录名称
//以当前日期命名的文件夹名称
QString str_day = QDateTime::currentDateTime().toString("yyyyMMdd");	
QString day_path = save_path + "/" + str_day;
QDir day_dir(day_path);	//列出当前日期命名的文件夹
if(!day_dir.exists())	//若不存在,则创建
{
	QDir().mkdir(day_path);
}
//以当前时间命名的文件夹名称
QString str_time = QDateTime::currentDateTime().toString("hhmmss");
QString time_path = day_path + "/" + str_time;
QDir time_dir(time_path);	//列出当前时间命名的文件夹
if(!time_dir.exists())	//若不存在,则创建
{
	QDir().mkdir(time_path);
}

上述代码需包含QString、QDir、QTime头文件

2、QDir的使用

参考QDir说明和使用Qt遍历文件夹

QDir 是 Qt 框架中用于处理文件和目录的类,提供了许多方便的方法来操作文件系统,可用于获取目录下的文件和子目录列表、创建和删除目录、检查文件是否存在、可使用绝对路径或相对路径进行初始化,可通过设置路径来访问不同的目录。

2.1 常用属性和方法

exists():判断目录是否存在
currentPath():获取当前工作目录
setPath():设置目录路径
dirName():获取目录名
entryList():获取目录中的文件和子目录列表
mkdir():创建目录
rmdir():删除目录
remove():删除文件

QDir dir(path);
//设置类型过滤器,只为文件格式
dir.setFilter(QDir::Files | QDir::NoSymLinks);
QStringList filters;
filters<<QString("*.jpeg")<<QString("*.jpg")<<QString("*.png")
<<QString("*.tiff")<<QString("*.gif")<<QString("*.bmp");
//设置文件名称过滤器,只为filters格式
//(后缀为.jpeg、.jpg、.png、.tiff、.gif、.bmp格式)
dir.setNameFilters(filters);

2.2 遍历文件夹

2.2.1 遍历文件夹下一层的文件

方法一:遍历文件的下一层,对于系统而言包括:文件夹、文件、快捷方式,使用setFilter即可过滤。通过entryInfoList则可以获取过滤后所得到的文件夹下的文件信息列表,遍历文件通过操作QFileInfo可得到所需的文件详细信息(大小、类型、后缀等)。

void traverse_childFolder(QString path)
{
	//判断路径是否存在
    QDir dir(path);
    if(!dir.exists())
    {
        return;
    }
    dir.setFilter(QDir::Files | QDir::NoSymLinks);
    QFileInfoList list = dir.entryInfoList();

    int file_count = list.count();
    if(file_count <= 0)
    {
        return;
    }

    QStringList string_list;
    for(int i=0; i<file_count; i++)
    {
        QFileInfo file_info = list.at(i);
        QString suffix = file_info.suffix();
        if(QString::compare(suffix, QString("png"), Qt::CaseInsensitive) == 0)   
        {   
            QString absolute_file_path = file_info.absoluteFilePath();
            string_list.append(absolute_file_path);
        }
    }
}

方法二:

void traverse_childFolder(QString path)
{
	//判断路径是否存在
    QDir dir(path);
    if(!dir.exists())
    {
        return;
    }
    //设置类型过滤器,只为文件格式
    dir.setFilter(QDir::Files | QDir::NoSymLinks);
    QStringList filters;
    filters<<QString("*.jpeg")<<QString("*.jpg")<<QString("*.png")<<QString("*.tiff")<<QString("*.gif")<<QString("*.bmp");
    //设置文件名称过滤器,只为filters格式
    //(后缀为.jpeg、.jpg、.png、.tiff、.gif、.bmp格式)
    dir.setNameFilters(filters);  

    int dir_count = dir.count();
    if(dir_count <= 0)
    {
        return;
    }    
    QStringList string_list;
    //获取分隔符
    //QChar separator = QDir::separator();
    QChar separator = QChar('/');
    if(!path.contains(separator))
    {
        separator = QChar('\\');
    }
    QChar last_char = path.at(path.length()-1);
    if(last_char == separator)
    {
        separator = QChar();
    }    
    for(uint i=0; i<dir_count; i++)
    {
        QString file_name = dir[i];  //文件名称
        QString file_path = path + separator + file_name;   //文件全路径
        string_list.append(file_path);
    }
    //string_list 添加完成之后,就可以查看list中的文件路径了
}

如果只需要获取指定路径下的文件名,则可去掉“获取分隔符”部分代码(上述代码是为了获取文件的全路径)。QDir::separator()用于获取分隔符,Windows系统下为‘\’,linux系统下为‘/’。
设定filters后,存在一定的问题。Windows下文件名是忽略大小写的(包括扩展名),若filters设定了“*.jpg”之后,就不可添加扩展名为“.Jpg”、“.JPG”等大小写兼有的文件了,可通过以下方法解决
去掉setNameFilters(filters);上述代码已获取文件全路径,可通过QFileInfo file_info(file_path)获取文件信息的对象;通过file_info.suffix()或者completeSuffix()来判定文件的后缀、扩展名;获取之后比较时忽略大小写,如:compare(suffix, QString("*.jpeg"), Qt::CaseInsensitive) == 0

2.2.2 级联遍历文件夹及其子孙文件夹中的文件

void traverse_folders(Qstring path)
{
	//判断路径是否存在
	QDir dir(path);
    if(!dir.exists())
    {
        QDir().mkdir(path);	//不存在则创建
    }
    //获取所选文件类型过滤器
    QStringList filters;
    filters<<QString("*.jpeg")<<QString("*.jpg")<<QString("*.png")<<QString("*.tiff")<<QString("*.gif")<<QString("*.bmp");

    //定义迭代器并设置过滤器
    //QDirIterator定义过程中可设置过滤器,包括:文件名称、文件类型等
    QDirIterator dir_iterator(path,
        filters,	//过滤文件名称
        QDir::Files | QDir::NoSymLinks,		//过滤文件类型(只为文件格式)
        QDirIterator::Subdirectories);
    QStringList string_list;
    while(dir_iterator.hasNext())
    {
        dir_iterator.next();
        QFileInfo file_info = dir_iterator.fileInfo();
        QString absolute_file_path = file_info.absoluteFilePath();
        string_list.append(file_path);
    }
}
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值