声明

  1. #include <QCryptographicHash>
  2. #include <QDebug>
  3. #include <QDir>
  4. #include <QDirIterator>
  5. #include <QFile>
  6. #include <QTextStream>
  7. #include <QVector>
  8. class FileUtils {
  9. public:
  10. static bool CopyDirectory(const QString& fromDir, const QString& toDir, bool bReplace = false);
  11. static bool CopyFiles(const QStringList fromFile, const QString toDir);
  12. static bool WriteLinesToFile(QFile& file, const QVector<QString>& vecFileContent);
  13. static void GetSpecificFormatFilePath(const QString& dir, const QStringList& nameFilters, QFileInfoList& fileInfoList);
  14. static void GetSpecificFormatFilePath(QString dir, QStringList& fileList, QString filter = "*.*");
  15. static bool DelSpecificFormatFile(const QString& dir, const QStringList& nameFilters);
  16. static bool DelEmptyDir(const QString& dir);
  17. static bool DelEmptyDirInDir(const QString& dir);
  18. static QString GetFileMd5(const QString& fileName);
  19. static bool ReplaceFile(const QString& strOldFile, const QString& strNewFile);
  20. static QString GetFileSize(qint64 size);
  21. };

实现

1. 拷贝文件夹至指定目录

  1. /**
  2. * @brief 拷贝文件夹,bRet为true则替换目标文件,删除原文件
  3. *
  4. * @author
  5. * @date 2021-02-21
  6. */
  7. bool FileUtils::CopyDirectory(const QString& fromDir, const QString& toDir, bool bReplace)
  8. {
  9. QDir sourceDir(fromDir);
  10. QDir targetDir(toDir);
  11. if (!sourceDir.exists()) {
  12. return false;
  13. }
  14. if (!targetDir.exists()) {
  15. if (!targetDir.mkdir(targetDir.absolutePath()))
  16. return false;
  17. }
  18. bool bRet = true;
  19. QFileInfoList fileInfoList = sourceDir.entryInfoList(QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, QDir::DirsLast);
  20. foreach (QFileInfo fileInfo, fileInfoList) {
  21. if (fileInfo.isDir()) {
  22. if (!CopyDirectory(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()), bReplace)) {
  23. bRet = false;
  24. }
  25. } else {
  26. //目标文件不存在
  27. if (!targetDir.exists(fileInfo.fileName())) {
  28. if (!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))) {
  29. bRet = false;
  30. continue;
  31. }
  32. //删除原文件
  33. if (bReplace) {
  34. if (!QFile::remove(fileInfo.filePath())) {
  35. bRet = false;
  36. continue;
  37. }
  38. }
  39. } else if (bReplace) {
  40. //目标文件存在,且需要替换
  41. if (!ReplaceFile(targetDir.filePath(fileInfo.fileName()), fileInfo.filePath())) {
  42. bRet = false;
  43. continue;
  44. }
  45. }
  46. }
  47. }
  48. return bRet;
  49. }

2.拷贝文件至指定目录

  1. /**
  2. * @brief 将文件拷贝到指定目录
  3. *
  4. * @author
  5. * @date 2021-02-21
  6. */
  7. bool FileUtils::CopyFiles(const QStringList fromFile, const QString toDir)
  8. {
  9. if (fromFile.isEmpty()) {
  10. return false;
  11. }
  12. QDir targetDir(toDir);
  13. if (!targetDir.exists()) {
  14. if (!targetDir.mkpath(targetDir.absolutePath()))
  15. return false;
  16. }
  17. bool bRet = true;
  18. for (const QString& file : fromFile) {
  19. QFileInfo fileInfo(file);
  20. if (!fileInfo.exists()) {
  21. bRet = false;
  22. continue;
  23. }
  24. if (!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))) {
  25. bRet = false;
  26. continue;
  27. }
  28. }
  29. return bRet;
  30. }

3.以覆盖方式,将内容按行写入文件

  1. /**
  2. * @brief 以覆盖方式,将内容按行写入文件
  3. *
  4. * @author
  5. * @date 2021-02-21
  6. */
  7. bool FileUtils::WriteLinesToFile(QFile& file, const QVector<QString>& vecFileContent)
  8. {
  9. bool bRet = true;
  10. do {
  11. if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) {
  12. //以覆盖方式打开失败
  13. bRet = false;
  14. break;
  15. }
  16. QTextStream qWriteStream(&file);
  17. for (auto iter = vecFileContent.begin(); iter < vecFileContent.end(); iter++) {
  18. qWriteStream << *iter << "\n";
  19. }
  20. file.close();
  21. } while (0);
  22. if (file.isOpen()) {
  23. file.close();
  24. }
  25. return bRet;
  26. }

4.递归获取指定文件夹下特定后缀的文件

  1. /**
  2. * @brief 递归获取指定文件夹下特定后缀的文件
  3. *
  4. * @author
  5. * @date 2021-02-21
  6. */
  7. void FileUtils::GetSpecificFormatFilePath(const QString& dir, const QStringList& nameFilters, QFileInfoList& fileInfoList)
  8. {
  9. QDir tarDir(dir);
  10. QFileInfoList fileList = tarDir.entryInfoList(nameFilters);
  11. QFileInfoList dirList = tarDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
  12. foreach (QFileInfo fileInfo, dirList) {
  13. QString dirPath = fileInfo.absoluteFilePath();
  14. GetSpecificFormatFilePath(dirPath, nameFilters, fileInfoList);
  15. }
  16. foreach (QFileInfo fileInfo, fileList) {
  17. fileInfoList.push_back(fileInfo);
  18. }
  19. }

5.从指定的文件夹中获取所有文件列表

  1. /**
  2. * @brief 从指定的文件夹中获取所有文件列表
  3. *
  4. * @author
  5. * @date 2021-02-21
  6. * @param dir 指定的文件夹路径
  7. * @param fileList 所有文件列表
  8. */
  9. void FileUtils::GetSpecificFormatFilePath(QString path, QStringList& fileList, QString filter)
  10. {
  11. QDir dir(path);
  12. if (!dir.exists()) {
  13. return;
  14. }
  15. //获取所选文件类型过滤器
  16. QStringList filters;
  17. filters << filter;
  18. //定义迭代器并设置过滤器
  19. QDirIterator dirIterator(path,
  20. filters,
  21. QDir::Files | QDir::NoSymLinks,
  22. QDirIterator::Subdirectories);
  23. while (dirIterator.hasNext()) {
  24. dirIterator.next();
  25. QFileInfo fileInfo = dirIterator.fileInfo();
  26. fileList.append(fileInfo.absoluteFilePath());
  27. }
  28. }

6.删除指定文件夹下特定后缀的文件

  1. /**
  2. * @brief 删除指定文件夹下特定后缀的文件
  3. *
  4. * @author
  5. * @date 2021-02-21
  6. * @param dir 指定的文件夹路径
  7. * @param fileList 所有文件列表
  8. */
  9. bool FileUtils::DelSpecificFormatFile(const QString& dir, const QStringList& nameFilters)
  10. {
  11. bool bRet = true;
  12. do {
  13. QFileInfoList fileInfoList;
  14. GetSpecificFormatFilePath(dir, nameFilters, fileInfoList);
  15. foreach (QFileInfo fileInfo, fileInfoList) {
  16. if (!QFile::remove(fileInfo.filePath())) {
  17. bRet = false;
  18. }
  19. }
  20. } while (0);
  21. return bRet;
  22. }

7.递归删除指定文件夹下所有空文件夹(包括指定文件夹)

  1. bool FileUtils::DelEmptyDir(const QString& dir)
  2. {
  3. QDir targetDir(dir);
  4. if (!targetDir.exists()) {
  5. return false;
  6. }
  7. QFileInfoList FileInfoList = targetDir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot);
  8. bool bRet = true;
  9. foreach (QFileInfo fileInfo, FileInfoList) {
  10. if (fileInfo.isDir()) {
  11. if (!DelEmptyDir(fileInfo.filePath())) {
  12. bRet = false;
  13. }
  14. }
  15. }
  16. if (targetDir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot).count() == 0) {
  17. if (!targetDir.removeRecursively()) {
  18. bRet = false;
  19. }
  20. }
  21. return bRet;
  22. }

8.递归删除指定文件夹下所有空文件夹(不包括指定文件夹)

  1. bool FileUtils::DelEmptyDirInDir(const QString& dir)
  2. {
  3. bool bRet = true;
  4. QDir targetDir(dir);
  5. QFileInfoList dirList = targetDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
  6. foreach (QFileInfo dirInfo, dirList) {
  7. if (!FileUtils::DelEmptyDir(dirInfo.filePath())) {
  8. bRet = false;
  9. }
  10. }
  11. return bRet;
  12. }

9.获取文件md5

  1. QString FileUtils::GetFileMd5(const QString& fileName)
  2. {
  3. QFile f(fileName);
  4. QString strMd5 = "";
  5. if (f.open(QFile::ReadOnly)) {
  6. QCryptographicHash hash(QCryptographicHash::Md5);
  7. if (hash.addData(&f)) {
  8. strMd5 = hash.result().toHex();
  9. }
  10. }
  11. f.close();
  12. return strMd5;
  13. }

10.替换文件

  1. bool FileUtils::ReplaceFile(const QString& strOldFile, const QString& strNewFile)
  2. {
  3. bool bRet = false;
  4. do {
  5. //现有文件改名为.bak
  6. if (QFile::exists(strOldFile)) {
  7. if (!QFile::rename(strOldFile, strOldFile + ".bak")) {
  8. break;
  9. }
  10. }
  11. //移动新的文件到策略目录下
  12. if (!QFile::rename(strNewFile, strOldFile)) {
  13. //移动失败,把.bak恢复为原文件
  14. if (QFile::exists(strOldFile + ".bak")) {
  15. if (!QFile::rename(strOldFile + ".bak", strOldFile)) {
  16. //恢复失败
  17. }
  18. }
  19. break;
  20. }
  21. //删除.bak
  22. if (QFile::exists(strOldFile + ".bak")) {
  23. if (!QFile::remove(strOldFile + ".bak")) {
  24. //
  25. }
  26. }
  27. bRet = true;
  28. } while (0);
  29. return bRet;
  30. }

11.获得文件大小(包含单位)

  1. QString FileUtils::GetFileSize(qint64 size)
  2. {
  3. char unit = 'B';
  4. qint64 curSize = size;
  5. if (curSize > 1024) {
  6. curSize /= 1024;
  7. unit = 'K';
  8. if (curSize > 1024) {
  9. curSize /= 1024;
  10. unit = 'M';
  11. if (curSize > 1024) {
  12. curSize /= 1024;
  13. unit = 'G';
  14. }
  15. }
  16. }
  17. return QString("%0%1").arg(curSize).arg(unit);
  18. }