在做一个项目的时候,需要获取一个指定的文件夹下的所有子文件夹下的所有文件的全路径,这样将所有文件的绝对路径取到,然后对这些文件进行处理。
在发现没有相关的Qt自带的函数后,自己写了如下的函数。
头文件:
#ifndef ALLFILESORPATHINDIR_H
#define ALLFILESORPATHINDIR_H
#include <QString>
#include <QStringList>
class AllFilesOrPathInDir
{
public:
AllFilesOrPathInDir();
/**
* @brief AllFilesOrPathInDir 构造函数
* @param dirPath 目录的路径
*/
AllFilesOrPathInDir(QString dirPath);
/** 设置目录
* @brief setDirPath
* @param dirPath 目标文件夹的目录
*/
void setDirPath(QString dirPath);
/** 获取指定目录下的文件路径+名称
* @brief getFilePathNameOfSplDir
* @param dirPath 目标文件夹的目录
* @return
*/
QStringList getFilePathNameOfSplDir(QString dirPath);
/** 获取在指定目录下的目录的路径
* @brief getDirPathOfSplDir
* @param dirPath
* @return
*/
QStringList getDirPathOfSplDir(QString dirPath);
/** 获取指定目录下的文件和目录的全路径
* @brief getFileAndDirPathNameOfSplDir
* @param dirPath
* @return
*/
QStringList getFileAndDirPathNameOfSplDir(QString dirPath);
/** 在指定文件夹下的文件数
* @brief fileConutInSplDir
* @param dirPath
* @return
*/
int fileConutInSplDir(QString dirPath);
/** 在指定文件夹下的目录数
* @brief dirCountInSplDir
* @param dirPath
* @return
*/
int dirCountInSplDir(QString dirPath);
/** 获取指定目录及其子目录下文件的全路径
* @brief getFilePathNameOfSplAndChildDir
* @param dirPath
* @return
*/
QStringList getFilePathNameOfSplAndChildDir(QString dirPath);
/** 获取指定目录及其子目录下的文件夹的全路径
* @brief getDirPathOfSplAndChildDir
* @param dirPath
* @return
*/
QStringList getDirPathOfSplAndChildDir(QString dirPath);
/** 获取指定目录及其子目录下的文件与目录的全路径
* @brief getFileAndDirPathNameOfSplAndChildDir
* @param dirPath
* @return
*/
QStringList getFileAndDirPathNameOfSplAndChildDir(QString dirPath);
private:
QString dirPath;
};
#endif // ALLFILESORPATHINDIR_H
源文件:
#include "AllFilesOrPathInDir.h"
#include <QFileInfo>
#include <QFileInfoList>
#include <QDir>
#include <QDebug>
AllFilesOrPathInDir::AllFilesOrPathInDir()
{
}
AllFilesOrPathInDir::AllFilesOrPathInDir(QString dirPath)
{
this->dirPath = dirPath;
testCode();
}
void AllFilesOrPathInDir::setDirPath(QString dirPath)
{
this->dirPath = dirPath;
}
QStringList AllFilesOrPathInDir::getFilePathNameOfSplDir(QString dirPath)
{
QStringList filePathNames;
QDir splDir(dirPath);
QFileInfoList fileInfoListInSplDir = splDir.entryInfoList(QDir::Files);
QFileInfo tempFileInfo;
foreach (tempFileInfo, fileInfoListInSplDir) {
// absoluteFilePath() -- 截取到的是文件夹的路径
// absolutePath() -- 截取的是文件夹所在路径
filePathNames << tempFileInfo.absoluteFilePath();
}
return filePathNames;
}
QStringList AllFilesOrPathInDir::getDirPathOfSplDir(QString dirPath)
{
QStringList dirPaths;
QDir splDir(dirPath);
QFileInfoList fileInfoListInSplDir = splDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
QFileInfo tempFileInfo;
foreach (tempFileInfo, fileInfoListInSplDir) {
dirPaths << tempFileInfo.absoluteFilePath();
}
return dirPaths;
}
QStringList AllFilesOrPathInDir::getFileAndDirPathNameOfSplDir(QString dirPath)
{
QStringList fileAndDirPathNames;
fileAndDirPathNames << getFilePathNameOfSplDir(dirPath);
fileAndDirPathNames << getDirPathOfSplDir(dirPath);
return fileAndDirPathNames;
}
int AllFilesOrPathInDir::fileConutInSplDir(QString dirPath)
{
return QDir(dirPath).entryList(QDir::Files).count();
}
int AllFilesOrPathInDir::dirCountInSplDir(QString dirPath)
{
return QDir(dirPath).entryList(QDir::Dirs | QDir::NoDotAndDotDot).count();
}
QStringList AllFilesOrPathInDir::getFilePathNameOfSplAndChildDir(QString dirPath)
{
QStringList filePathNames;
// 首先,得到这个目录下面的文件全部
filePathNames << getFilePathNameOfSplDir(dirPath);
QStringList childDirs;
childDirs << getDirPathOfSplDir(dirPath);
QString tempChildDir;
foreach (tempChildDir, childDirs) {
// 取其子文件夹内容
filePathNames << getFilePathNameOfSplAndChildDir(tempChildDir);
}
return filePathNames;
}
QStringList AllFilesOrPathInDir::getDirPathOfSplAndChildDir(QString dirPath)
{
QStringList dirPathNames;
dirPathNames << getDirPathOfSplDir(dirPath);
QString tempChildDir;
foreach (tempChildDir, dirPathNames) {
dirPathNames << getDirPathOfSplAndChildDir(tempChildDir);
}
return dirPathNames;
}
QStringList AllFilesOrPathInDir::getFileAndDirPathNameOfSplAndChildDir(QString dirPath)
{
QStringList fileAndDirPathNames;
fileAndDirPathNames << getFilePathNameOfSplDir(dirPath);
QStringList childDirs;
childDirs << getDirPathOfSplDir(dirPath);
QString tempChildDir;
foreach (tempChildDir, childDirs) {
fileAndDirPathNames << tempChildDir;
// 取其子文件夹内容
fileAndDirPathNames << getFileAndDirPathNameOfSplAndChildDir(tempChildDir);
}
return fileAndDirPathNames;
}
在上面的代码里面没有写对默认set进来的路径和构造函数进来的路径的代码,但是显而易见非常容易,写几个没有参数的同样的方法名,然后在其函数内部进行对上面函数的调用即可实现。