Advertisement
alexarcan

os_lab5_recursiv un director

Oct 26th, 2015
335
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. /*recursiv un director dat ca argument în linia
  2. de comandă
  3. ➟ afișează
  4. → pentru legături simbolice: numele și calea indicată
  5. → pentru alte fișiere: numele
  6. - dacă fișierul e executabil, afișează * la sfârșitul
  7. numelui acestuia
  8. → indentează afișarea în funcție de adâncimea în
  9. arbore
  10. */
  11. /*
  12. * (c) 2013 Dan C. Cosma
  13. */
  14.  
  15. #include <stdlib.h>
  16. #include <stdio.h>
  17. #include <sys/types.h>
  18. #include <string.h>
  19. #include <errno.h>
  20. #include <dirent.h>
  21. #include <unistd.h>
  22. #include <sys/stat.h>
  23. #include <limits.h>
  24.  
  25. void parcurge(char *nume_dir, int nivel)
  26. {
  27. DIR *dir;
  28. struct dirent *in;
  29. char *nume;
  30. struct stat info;
  31. char cale[PATH_MAX], cale_link[PATH_MAX + 1], spatii[PATH_MAX];
  32. int n;
  33.  
  34. memset(spatii, ' ', 2*nivel);
  35. spatii[2*nivel]='\0';
  36.  
  37. if(!(dir = opendir(nume_dir)))
  38. {
  39. printf("%s: ", nume_dir); fflush(stdout);
  40. perror("opendir");
  41. exit(1);
  42. }
  43.  
  44. printf("%sDIR %s:\n", spatii, nume_dir);
  45.  
  46. while((in = readdir(dir))>0)
  47. {
  48. nume = in->d_name;
  49.  
  50. if(strcmp(nume, ".") == 0 || strcmp(nume, "..")==0)
  51. continue;
  52.  
  53. snprintf(cale, sizeof(cale), "%s/%s", nume_dir, nume);
  54.  
  55. if(lstat(cale, &info)<0)
  56. {
  57. printf("%s: ", cale); fflush(stdout);
  58. perror("eroare la lstat");
  59. exit(1);
  60. }
  61.  
  62. if(S_ISDIR(info.st_mode))
  63. parcurge(cale, nivel + 1);
  64. else
  65. if(S_ISLNK(info.st_mode))
  66. {
  67. n = readlink(cale, cale_link, sizeof(cale_link));
  68. cale_link[n]='\0';
  69. printf("%s %s -> %s\n", spatii, cale, cale_link);
  70. }
  71. else
  72. {
  73. printf("%s %s", spatii, cale);
  74. if(info.st_mode & S_IXUSR || info.st_mode & S_IXGRP || info.st_mode & S_IXOTH)
  75. printf("*");
  76. printf("\n");
  77. }
  78.  
  79. }
  80. closedir(dir);
  81. }
  82.  
  83. int main(int argc, char *argv[])
  84. {
  85. if(argc != 2)
  86. {
  87. printf("Mod de utilizare: %s director\n", argv[0]);
  88. exit(1);
  89. }
  90.  
  91. parcurge(argv[1], 0);
  92.  
  93. return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement