dir.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdbool.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdarg.h>
  7. #include <dirent.h>
  8. #include <unistd.h>
  9. #include "util/dir.h"
  10. #include "util/file.h"
  11. #include "util/log.h"
  12. DIR *open_dir(const char *directory)
  13. {
  14. return opendir(directory);
  15. }
  16. bool is_dir(const char *folder_to_check)
  17. {
  18. DIR *dir = opendir(folder_to_check);
  19. if (!dir)
  20. return false;
  21. closedir(dir);
  22. return true;
  23. }
  24. bool check_if_dir_exists(const char *directory)
  25. {
  26. DIR *dir = opendir(directory);
  27. if (!dir) return false;
  28. closedir(dir);
  29. return true;
  30. }
  31. bool change_dir(const char *path, ...)
  32. {
  33. char full_path[0x301] = {0};
  34. va_list v;
  35. va_start(v, path);
  36. vsprintf(full_path, path, v);
  37. va_end(v);
  38. bool ret = chdir(full_path) == 0 ? true : false;
  39. if (!ret)
  40. printf("failed to change dir %s\n", full_path);
  41. return ret;
  42. }
  43. size_t get_dir_total(const char *directory)
  44. {
  45. size_t number_of_files = 0;
  46. struct dirent *d = {0};
  47. DIR *dir = open_dir(directory);
  48. if (!dir)
  49. return 0;
  50. while ((d = readdir(dir)))
  51. {
  52. if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
  53. continue;
  54. number_of_files++;
  55. }
  56. closedir(dir);
  57. return number_of_files;
  58. }
  59. size_t get_dir_size(const char *directory)
  60. {
  61. size_t size = 0;
  62. DIR *dir = open_dir(directory);
  63. struct dirent *d = {0};
  64. if (!dir)
  65. return 0;
  66. while ((d = readdir(dir)))
  67. {
  68. if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
  69. continue;
  70. char *full_path;
  71. if (!asiprintf(&full_path, "%s/%s", directory, d->d_name))
  72. return size;
  73. if (is_dir(full_path))
  74. size += get_dir_size(full_path);
  75. else
  76. size += get_file_size(full_path);
  77. free(full_path);
  78. }
  79. return size;
  80. }
  81. size_t get_dir_total_recursive(const char *directory)
  82. {
  83. size_t num = 0;
  84. struct dirent *d = {0};
  85. DIR *dir = open_dir(directory);
  86. if (!dir)
  87. return 0;
  88. while ((d = readdir(dir)))
  89. {
  90. if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
  91. continue;
  92. char *full_path;
  93. if (!asiprintf(&full_path, "%s/%s", directory, d->d_name))
  94. return num;
  95. if (is_dir(d->d_name))
  96. num += get_dir_total(d->d_name);
  97. num++;
  98. free(full_path);
  99. }
  100. closedir(dir);
  101. return num;
  102. }
  103. size_t get_dir_total_filter(const char *directory, const char *filter)
  104. {
  105. size_t num = 0;
  106. struct dirent *d = {0};
  107. DIR *dir = open_dir(directory);
  108. if (!dir)
  109. return 0;
  110. while ((d = readdir(dir)))
  111. {
  112. if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
  113. continue;
  114. char *full_path;
  115. if (!asiprintf(&full_path, "%s/%s", directory, d->d_name))
  116. return num;
  117. if (is_dir(d->d_name))
  118. num += get_dir_total_filter(d->d_name, filter);
  119. if (strstr(full_path, filter))
  120. num++;
  121. free(full_path);
  122. }
  123. closedir(dir);
  124. return num;
  125. }
  126. void list_dir(const char *directory)
  127. {
  128. struct dirent *d = {0};
  129. DIR *dir = opendir(directory);
  130. write_log("\nlisting dir\n");
  131. if (!dir) return;
  132. while ((d = readdir(dir)))
  133. {
  134. write_log("found %s\n", d->d_name);
  135. }
  136. write_log("finished listing dir\n\n");
  137. closedir(dir);
  138. }
  139. bool create_dir(const char *dir)
  140. {
  141. if (check_if_dir_exists(dir))
  142. return true;
  143. return mkdir(dir, 0777) == 0;
  144. }
  145. void delete_dir(const char *directory)
  146. {
  147. struct dirent *d = {0};
  148. DIR *dir = open_dir(directory);
  149. if (!dir)
  150. return;
  151. while ((d = readdir(dir)))
  152. {
  153. if (!strcmp(d->d_name, ".") || !strcmp(d->d_name, ".."))
  154. continue;
  155. char *full_path;
  156. if (!asiprintf(&full_path, "%s/%s", directory, d->d_name))
  157. return;
  158. is_dir(full_path) ? delete_dir(full_path) : delete_file(full_path);
  159. free(full_path);
  160. }
  161. closedir(dir);
  162. rmdir(directory);
  163. }
  164. void copy_dir(const char *src, char *dest)
  165. {
  166. if (!create_dir(dest))
  167. return;
  168. struct dirent *d = {0};
  169. DIR *dir = open_dir(src);
  170. if (!dir)
  171. return;
  172. char buffer[0x301] = {0};
  173. while ((d = readdir(dir)))
  174. {
  175. snprintf(buffer, sizeof(buffer), "%s/%s", dest, d->d_name);
  176. // check if the file is a directory.
  177. if (is_dir(d->d_name))
  178. {
  179. create_dir(buffer);
  180. copy_dir(d->d_name, d->d_name);
  181. }
  182. else
  183. copy_file(d->d_name, buffer);
  184. }
  185. closedir(dir);
  186. }
  187. void move_folder(const char *src, char *dest)
  188. {
  189. DIR *dir = open_dir(src);
  190. struct dirent *d = {0};
  191. create_dir(dest);
  192. while ((d = readdir(dir)))
  193. {
  194. char *full_path;
  195. if (!asiprintf(&full_path, "%s/%s", src, d->d_name))
  196. return;
  197. // check if the file is a directory.
  198. if (is_dir(d->d_name))
  199. create_dir(full_path);
  200. else
  201. move_file(d->d_name, full_path);
  202. free(full_path);
  203. }
  204. closedir(dir);
  205. }