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