Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- #include<dirent.h>
- #include<sys/stat.h>
- #include<sys/types.h>
- #include<unistd.h>
- #include<fcntl.h>
- /* Cerinta: Realizati un program C care sa duplice un director sursa
- (inclusiv subdirectoarele continute) intr-un director destinatie.
- Ambele nume de directoare vor fi transmise ca si argumente din linia de comanda.
- Programul va putea functiona in doua moduri:
- 1. fisierele destinatie vor fi copii ale fisierelor sursa.
- 2. fisierele destinatie vor fi lunkuri catre fisierele sursa.
- Obs.
- - in cazul copierii, fisierele destinatie vor avea aceleasi drepturi de acces cu fisierele sursa.
- - tema va fi insotita de Makefile corespunzator.
- */
- void copiere_fisier(char* sursa,char* dest)
- {
- struct stat st; //stats fisiere
- int s,d,continut; //fisierele sursa,destinatie si continutul de copiat
- char buffer[50]; //numele fisierului
- s=open(sursa, O_RDONLY); //deschidem fisierul care urmeaza sursa fi copiat
- stat(sursa,&st); //aflam drepturile de acces ale fisierului care urmeaza sursa fi copiat
- d=open(dest, O_CREAT|O_WRONLY,st.st_mode); //creeam copia fisierului cu aceleasi drepturi de acces
- continut=read(s, buffer, strlen(buffer)); //citim continutul fisierului(continut=nr de biti cititi)
- write(d, buffer, continut); //se scrie continutul fisierului original in copie
- close(s); //inchidem fisierele deschise
- close(d);
- }
- void copiere_director(char* sursa,char* dest)
- {
- struct stat st; //stats fisiere/foldere
- DIR *s=NULL; //directorul sursa
- struct dirent *c = NULL; //continutul unui folder
- char cs[50],cd[50]; //cale sursa si cale destinatie
- s=opendir(sursa); //deschidem sursa
- if(s!=NULL) //daca sursa exista
- {
- stat(sursa,&st); //aflam drepturile de acces sursa sursei
- mkdir(dest,st.st_mode); //cream folderul destinatie cu aceleasi drepturi de acces
- while(c=readdir(s)) //citim continutul folderului sursa
- {
- if(strcmp(c->d_name,".")!=0&&strcmp(c->d_name,"..")!=0) //evitam caile .. si .
- {
- strcpy(cs,sursa); //cream calea sursa
- strcpy(cd,dest); //cream calea destinatie
- if(cs[strlen(cs)-1]!='/') //adaugam la cale / in cazul in care nu exista
- strcat(cs,"/");
- if(cd[strlen(cd)-1]!='/')
- strcat(cd,"/");
- strcat(cs,c->d_name); //adaugam numele fisierulului/folderului curent
- strcat(cd,c->d_name);
- stat(cs,&st); //verificam daca sursa curenta este folder sau fisier
- if(S_ISDIR(st.st_mode))
- copiere_director(cs,cd); //in cazul unui folder reapelam functia curenta recursiv
- if(S_ISREG(st.st_mode))
- copiere_fisier(cs,cd); //in cazul unui fisier, copiem fisierul
- }
- }
- }
- }
- int main(int argc, char *argv[])
- { int opt;
- if(argc < 3)
- {
- printf("Introduceti fisierul sursa si fisierul destinatie!\n");
- exit(1);
- }
- copiere_director(argv[1], argv[2]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement