Advertisement
Guest User

Untitled

a guest
Apr 18th, 2019
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.42 KB | None | 0 0
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <dirent.h>
  6.  
  7. #include <string.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10.  
  11. //extrage din calea sursa numele fisierului/folderului
  12. char *getFileName(char *nume, char *path){
  13. int i,j=0;
  14. for(i=strlen(path)-1;path[i]!='/';i--);
  15. while(path[++i]!='\0'){
  16. nume[j++]=path[i];
  17. }
  18. nume[j]='\0';
  19. return nume;
  20. }
  21.  
  22. //creeaza un folder la destinatie
  23. void makeFolder(char *src, char *dest, mode_t permissions){
  24. char folder[50];
  25.  
  26. getFileName(folder,src);
  27. strcat(dest,folder);
  28.  
  29. while(mkdir(dest,permissions)){
  30. strcat(dest,"_copy");
  31. }
  32. strcat(dest,"/");
  33. }
  34.  
  35. //copiaza continutul fisierelor in copii ale acestora in destinatie
  36. void copyFileContents(char *src, char *dest, mode_t permissions, off_t fileSize){
  37. char fileName[50];
  38. int fdSrc, fdDest;
  39. char buf[fileSize];
  40.  
  41. getFileName(fileName,src);
  42. strcat(dest,fileName);
  43.  
  44. fdDest=creat(dest,permissions);
  45. if(fdDest == -1){
  46. perror(dest);
  47. exit(-1);
  48. }
  49. else{
  50. fdSrc = open(src,O_RDONLY);
  51. read(fdSrc,buf,fileSize);
  52. write(fdDest,buf,fileSize);
  53. }
  54. close(fdSrc);
  55. close(fdDest);
  56. }
  57.  
  58. //parcurge folderul initial pentru a copia tot ce exista in acesta la destinatie
  59. void parseDir(char *src, char *dest, int mod){
  60. char src_aux[100], dest_aux[100];
  61.  
  62. strcpy(src_aux,src);
  63. strcpy(dest_aux,dest);
  64.  
  65. struct stat fileStat;
  66. DIR *dirSrc;
  67. struct dirent *dirEntry;
  68. stat(src_aux,&fileStat);
  69. if(S_ISDIR(fileStat.st_mode)){
  70. makeFolder(src_aux,dest_aux,fileStat.st_mode);
  71. dirSrc = opendir(src_aux);
  72. while(dirEntry = readdir(dirSrc)){ //itereaza pe toate fisierele din director
  73. if((strcmp(dirEntry->d_name,".")!=0) && (strcmp(dirEntry->d_name,"..")!=0)){
  74. strcat(src_aux,"/");
  75. strcat(src_aux,dirEntry->d_name);
  76. parseDir(src_aux,dest_aux,mod); //apelare recursiva
  77. strcpy(src_aux,src); //suprascrierea caii cu cea veche, pentru intoarcere
  78. }
  79. }
  80. strcpy(dest_aux,dest); //suprascrierea caii cu cea veche, pentru intoarcere
  81. return ;
  82. }
  83. else if(S_ISREG(fileStat.st_mode)){
  84. if(mod == 0){ //copy file
  85. copyFileContents(src_aux, dest_aux, fileStat.st_mode, fileStat.st_size);
  86. }else{ //link file
  87. char filePath[100], fileName[100];
  88. getFileName(fileName,src_aux);
  89. strcpy(filePath,dest_aux);
  90. strcat(filePath,fileName);
  91. if(link(src_aux,filePath) == -1)
  92. printf("\nFisierul %s nu a putut fi link-uit\n",fileName);
  93. }
  94. return ;
  95. }
  96. }
  97.  
  98. //executa programul in mod copiere/link [0/1]
  99. void dirCopy(int argc, char *argv[], int argvPos,int mod){
  100. char src[100], src_aux[100], dest[100];
  101. struct stat fileStat;
  102. DIR *dirSrc;
  103. struct dirent *dirEntry;
  104.  
  105. strcpy(src,argv[1+argvPos]);
  106. strcpy(dest,argv[argvPos+2]);
  107.  
  108. if(src[strlen(src)-1] == '/')
  109. src[strlen(src)-1] = '\0';
  110. if(dest[strlen(dest)-1] != '/')
  111. strcat(dest,"/");
  112.  
  113. if(stat(src,&fileStat) == 0){
  114. strcpy(src_aux,src);
  115. if(S_ISDIR(fileStat.st_mode)){
  116. makeFolder(src_aux,dest,fileStat.st_mode);//creeaza folderul initial
  117. dirSrc=opendir(src_aux);
  118. while(dirEntry = readdir(dirSrc)){ // cat timp exista entry in folderul de baza
  119. if((strcmp(dirEntry->d_name,".")!=0) && (strcmp(dirEntry->d_name,"..")!=0)){
  120. strcat(src_aux,"/");strcat(src_aux,dirEntry->d_name);
  121. parseDir(src_aux,dest,mod);
  122. strcpy(src_aux,src);
  123. }
  124. }
  125. }
  126. closedir(dirSrc);
  127. }
  128. else
  129. {
  130. printf("\nCaile nu sunt valide \n");
  131. printf("1:%s\n2:%s\n",src,dest);
  132. exit(-1);
  133. }
  134. }
  135.  
  136. //cauta flag -c sau -l
  137. int findFlag(char *argv[]){
  138. int cod = 0;
  139. if(strcmp(argv[1],"-c")==0)
  140. cod = 1;
  141. else if (strcmp(argv[1],"-l")==0)
  142. cod = 2;
  143. return cod;
  144. }
  145.  
  146. int main(int argc, char *argv[]){
  147. switch(findFlag(argv)){
  148. case 0: // copiere implicit
  149. if(argc!=3){
  150. printf("Introduceti ca argumente : [-l/c]\tsursa\tdestinatie\n");
  151. exit(-1);
  152. }
  153. else{
  154. printf("Mod copiere\n");
  155. dirCopy(argc, argv, 0, 0);
  156. }
  157. break;
  158. case 1: //copiere explicit
  159. if(argc!=4){
  160. printf("Introduceti ca argumente : [-l/c]\tsursa\tdestinatie\n");
  161. exit(-1);
  162. }
  163. else{
  164. printf("Mod copiere explicit\n");
  165. dirCopy(argc, argv, 1, 0);
  166. }
  167. break;
  168. case 2: //link explicit
  169. if(argc!=4){
  170. printf("Introduceti ca argumente : [-l/c]\tsursa\tdestinatie\n");
  171. exit(-1);
  172. }
  173. else{
  174. printf("Mod link\n") ;
  175. dirCopy(argc, argv, 1, 1);
  176. }
  177. break;
  178. default:
  179. break;
  180. }
  181.  
  182. return 0;
  183. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement