file.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. /*
  2. * File: file.c
  3. * Author: Arthur Brandao
  4. *
  5. * Created on 23 novembre 2018
  6. */
  7. #define _DEFAULT_SOURCE
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <dirent.h>
  12. #include <sys/stat.h>
  13. #include <sys/types.h>
  14. #include <fcntl.h>
  15. #include "error.h"
  16. #include "str.h"
  17. #include "file.h"
  18. /* --- Fonctions publiques --- */
  19. boolean is_dir(const char* path) {
  20. struct stat stats;
  21. if (stat(path, &stats) == ERR) {
  22. addperror("Impossible d'analyser le fichier");
  23. return false;
  24. }
  25. //Verif existence que le chemin est bien un fichier
  26. if (S_ISDIR(stats.st_mode)) {
  27. return true;
  28. }
  29. return false;
  30. }
  31. char** file_list(const char* path, int* nb) {
  32. struct dirent **namelist;
  33. int scan, nbFile = 0, length;
  34. char** result;
  35. //Verif que le chemin est bien un dossier
  36. if (!is_dir(path)) {
  37. adderror("Le chemin n'est pas un dossier");
  38. if (nb != NULL) {
  39. *nb = ERR;
  40. }
  41. return NULL;
  42. }
  43. //Scan le repertoire
  44. scan = scandir(path, &namelist, 0, alphasort);
  45. if (nbFile < 0) {
  46. addperror("Impossible de scanner les fichiers");
  47. if (nb != NULL) {
  48. *nb = ERR;
  49. }
  50. return NULL;
  51. }
  52. //Compte le nombre de fichier dans le dossier
  53. int i = scan;
  54. while (i--) {
  55. if (namelist[i]->d_type == DT_REG && namelist[i]->d_name[0] != '.') {
  56. nbFile++;
  57. }
  58. }
  59. //Si le dossier est vide
  60. if (nbFile == 0) {
  61. if (nb != NULL) {
  62. *nb = 0;
  63. }
  64. return NULL;
  65. }
  66. //Ajout des resultats dans la variable
  67. result = malloc(sizeof (char*) * nbFile);
  68. for (int i = scan - 1, j = 0; i >= 0; i--, j++) {
  69. //Ne prend que les fichiers non cachés
  70. if (namelist[i]->d_type == DT_REG && namelist[i]->d_name[0] != '.') {
  71. length = strlen(namelist[i]->d_name) + 1;
  72. result[j] = malloc(sizeof (char) * length);
  73. memset(result[j], 0, length);
  74. strncpy(result[j], namelist[i]->d_name, length - 1);
  75. }
  76. }
  77. //Retourne chaine + ajout nombre de resultat
  78. if (nb != NULL) {
  79. *nb = nbFile;
  80. }
  81. return result;
  82. }
  83. char** file_list_all(const char* path, int* nb) {
  84. struct dirent **namelist;
  85. int scan, nbFile = 0, length;
  86. char** result;
  87. //Verif que le chemin est bien un dossier
  88. if (!is_dir(path)) {
  89. adderror("Le chemin n'est pas un dossier");
  90. if (nb != NULL) {
  91. *nb = ERR;
  92. }
  93. return NULL;
  94. }
  95. //Scan le repertoire
  96. scan = scandir(path, &namelist, 0, alphasort);
  97. if (nbFile < 0) {
  98. addperror("Impossible de scanner les fichiers");
  99. if (nb != NULL) {
  100. *nb = ERR;
  101. }
  102. return NULL;
  103. }
  104. //Compte le nombre de fichier dans le dossier
  105. int i = scan;
  106. while (i--) {
  107. if (namelist[i]->d_type == DT_REG) {
  108. nbFile++;
  109. }
  110. }
  111. //Si le dossier est vide
  112. if (nbFile == 0) {
  113. if (nb != NULL) {
  114. *nb = 0;
  115. }
  116. return NULL;
  117. }
  118. //Ajout des resultats dans la variable
  119. result = malloc(sizeof (char*) * nbFile);
  120. for (int i = scan - 1, j = 0; i >= 0; i--, j++) {
  121. //Ne prend que les fichiers non cachés
  122. if (namelist[i]->d_type == DT_REG) {
  123. length = strlen(namelist[i]->d_name) + 1;
  124. result[j] = malloc(sizeof (char) * length);
  125. memset(result[j], 0, length);
  126. strncpy(result[j], namelist[i]->d_name, length - 1);
  127. }
  128. }
  129. //Retourne chaine + ajout nombre de resultat
  130. if (nb != NULL) {
  131. *nb = nbFile;
  132. }
  133. return result;
  134. }
  135. char* file_get_content(const char* path) {
  136. int fd;
  137. off_t size;
  138. char* result;
  139. //Ouverture du fichier
  140. fd = open(path, O_RDONLY);
  141. if (fd == ERR) {
  142. addperror("Impossible d'ouvrir le fichier");
  143. return NULL;
  144. }
  145. //Recup la taille du fichier
  146. size = lseek(fd, 0L, SEEK_END);
  147. if (size == ERR) {
  148. addperror("Impossible de récupèrer la taille du fichier");
  149. return NULL;
  150. }
  151. //Creation de la chaine
  152. result = malloc(sizeof (char) * (size + 1));
  153. memset(result, 0, size + 1);
  154. //Retour au debut + lecture du fichier
  155. if (lseek(fd, 0L, SEEK_SET) == ERR) {
  156. addperror("Impossible de revenir au debut du fichier");
  157. free(result);
  158. return NULL;
  159. }
  160. if (read(fd, result, size) == ERR) {
  161. addperror("Impossible de lire le contenu du fichier");
  162. free(result);
  163. return NULL;
  164. }
  165. //Retourne la taille de la chaine
  166. return result;
  167. }