Advertisement
Guest User

Untitled

a guest
Nov 21st, 2019
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.86 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<dirent.h>
  5. #include<sys/stat.h>
  6. #include<sys/types.h>
  7. #include<unistd.h>
  8. #include<fcntl.h>
  9.  
  10. /* Cerinta: Realizati un program C care sa duplice un director sursa
  11. (inclusiv subdirectoarele continute) intr-un director destinatie.
  12. Ambele nume de directoare vor fi transmise ca si argumente din linia de comanda.
  13. Programul va putea functiona in doua moduri:
  14. 1. fisierele destinatie vor fi copii ale fisierelor sursa.
  15. 2. fisierele destinatie vor fi lunkuri catre fisierele sursa.
  16.  
  17. Obs.
  18. - in cazul copierii, fisierele destinatie vor avea aceleasi drepturi de acces cu fisierele sursa.
  19. - tema va fi insotita de Makefile corespunzator.
  20. */
  21.  
  22.  
  23.  
  24. void copiere_fisier(char* sursa,char* dest)
  25. {
  26. struct stat st; //stats fisiere
  27. int s,d,continut; //fisierele sursa,destinatie si continutul de copiat
  28. char buffer[50]; //numele fisierului
  29.  
  30. s=open(sursa, O_RDONLY); //deschidem fisierul care urmeaza sursa fi copiat
  31.  
  32. stat(sursa,&st); //aflam drepturile de acces ale fisierului care urmeaza sursa fi copiat
  33.  
  34. d=open(dest, O_CREAT|O_WRONLY,st.st_mode); //creeam copia fisierului cu aceleasi drepturi de acces
  35.  
  36. continut=read(s, buffer, strlen(buffer)); //citim continutul fisierului(continut=nr de biti cititi)
  37.  
  38. write(d, buffer, continut); //se scrie continutul fisierului original in copie
  39.  
  40. close(s); //inchidem fisierele deschise
  41. close(d);
  42. }
  43.  
  44. void copiere_director(char* sursa,char* dest)
  45. {
  46. struct stat st; //stats fisiere/foldere
  47. DIR *s=NULL; //directorul sursa
  48. struct dirent *c = NULL; //continutul unui folder
  49. char cs[50],cd[50]; //cale sursa si cale destinatie
  50.  
  51. s=opendir(sursa); //deschidem sursa
  52.  
  53. if(s!=NULL) //daca sursa exista
  54. {
  55. stat(sursa,&st); //aflam drepturile de acces sursa sursei
  56. mkdir(dest,st.st_mode); //cream folderul destinatie cu aceleasi drepturi de acces
  57. while(c=readdir(s)) //citim continutul folderului sursa
  58. {
  59. if(strcmp(c->d_name,".")!=0&&strcmp(c->d_name,"..")!=0) //evitam caile .. si .
  60. {
  61. strcpy(cs,sursa); //cream calea sursa
  62. strcpy(cd,dest); //cream calea destinatie
  63. if(cs[strlen(cs)-1]!='/') //adaugam la cale / in cazul in care nu exista
  64. strcat(cs,"/");
  65. if(cd[strlen(cd)-1]!='/')
  66. strcat(cd,"/");
  67. strcat(cs,c->d_name); //adaugam numele fisierulului/folderului curent
  68. strcat(cd,c->d_name);
  69.  
  70. stat(cs,&st); //verificam daca sursa curenta este folder sau fisier
  71. if(S_ISDIR(st.st_mode))
  72. copiere_director(cs,cd); //in cazul unui folder reapelam functia curenta recursiv
  73. if(S_ISREG(st.st_mode))
  74. copiere_fisier(cs,cd); //in cazul unui fisier, copiem fisierul
  75. }
  76. }
  77. }
  78.  
  79. }
  80.  
  81. int main(int argc, char *argv[])
  82. { int opt;
  83. if(argc < 3)
  84. {
  85. printf("Introduceti fisierul sursa si fisierul destinatie!\n");
  86. exit(1);
  87. }
  88. copiere_director(argv[1], argv[2]);
  89. return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement