Open Source Tomb Raider Engine
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FolderRecursive.cpp 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. /*!
  2. * \file src/utils/FolderRecursive.cpp
  3. * \brief Recursive file-system walking utilities
  4. *
  5. * \author xythobuz
  6. */
  7. #include "global.h"
  8. #include "utils/strings.h"
  9. #include "utils/Folder.h"
  10. unsigned long Folder::countRecursiveFiles() {
  11. createFolderItems();
  12. unsigned long count = fileCount();
  13. for (unsigned long i = 0; i < folderCount(); i++)
  14. count += getFolder(i).countRecursiveFiles();
  15. return count;
  16. }
  17. void Folder::executeRemoveRecursiveFiles(std::function<bool (File& f)> func) {
  18. executeRemoveFiles(func);
  19. for (unsigned long i = 0; i < folderCount(); i++) {
  20. getFolder(i).executeRemoveRecursiveFiles(func);
  21. }
  22. }
  23. std::string Folder::getRecursiveFileName(unsigned long i) {
  24. createFolderItems();
  25. orAssert(i < countRecursiveFiles());
  26. if (i < fileCount()) {
  27. return getFile(i).getName();
  28. } else {
  29. unsigned long count = fileCount();
  30. for (unsigned long n = 0; n < folderCount(); n++) {
  31. if ((i - count) < getFolder(n).countRecursiveFiles()) {
  32. return getFolder(n).getName() + '/'
  33. + getFolder(n).getRecursiveFileName(i - count);
  34. }
  35. count += getFolder(n).countRecursiveFiles();
  36. }
  37. }
  38. orAssert(false);
  39. return "";
  40. }
  41. File& Folder::getRecursiveFile(unsigned long i) {
  42. createFolderItems();
  43. orAssert(i < countRecursiveFiles());
  44. if (i < fileCount()) {
  45. return getFile(i);
  46. } else {
  47. unsigned long count = fileCount();
  48. for (unsigned long n = 0; n < folderCount(); n++) {
  49. if ((i - count) < getFolder(n).countRecursiveFiles()) {
  50. return getFolder(n).getRecursiveFile(i - count);
  51. }
  52. count += getFolder(n).countRecursiveFiles();
  53. }
  54. }
  55. orAssert(false);
  56. return files.at(0);
  57. }
  58. void Folder::findRecursiveFilesEndingWith(std::vector<File>& found, std::string end,
  59. bool casesensitive) {
  60. createFolderItems();
  61. for (unsigned long i = 0; i < countRecursiveFiles(); i++) {
  62. if (stringEndsWith(getRecursiveFile(i).getName(), end, casesensitive)) {
  63. found.push_back(getRecursiveFile(i));
  64. }
  65. }
  66. }