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

目录

  • 1、在根目录下创建年月日格式文件夹
  • 2、QDir的使用
    • 2.1 常用属性和方法
    • 2.2 遍历文件夹
      • 2.2.1 遍历文件夹下一层的文件
      • 2.2.2 级联遍历文件夹及其子孙文件夹中的文件

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);}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部