Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include <dirent.h>
- #include <string.h>
- #include <stdio.h>
- #include <stdlib.h>
- //extrage din calea sursa numele fisierului/folderului
- char *getFileName(char *nume, char *path){
- int i,j=0;
- for(i=strlen(path)-1;path[i]!='/';i--);
- while(path[++i]!='\0'){
- nume[j++]=path[i];
- }
- nume[j]='\0';
- return nume;
- }
- //creeaza un folder la destinatie
- void makeFolder(char *src, char *dest, mode_t permissions){
- char folder[50];
- getFileName(folder,src);
- strcat(dest,folder);
- while(mkdir(dest,permissions)){
- strcat(dest,"_copy");
- }
- strcat(dest,"/");
- }
- //copiaza continutul fisierelor in copii ale acestora in destinatie
- void copyFileContents(char *src, char *dest, mode_t permissions, off_t fileSize){
- char fileName[50];
- int fdSrc, fdDest;
- char buf[fileSize];
- getFileName(fileName,src);
- strcat(dest,fileName);
- fdDest=creat(dest,permissions);
- if(fdDest == -1){
- perror(dest);
- exit(-1);
- }
- else{
- fdSrc = open(src,O_RDONLY);
- read(fdSrc,buf,fileSize);
- write(fdDest,buf,fileSize);
- }
- close(fdSrc);
- close(fdDest);
- }
- //parcurge folderul initial pentru a copia tot ce exista in acesta la destinatie
- void parseDir(char *src, char *dest, int mod){
- char src_aux[100], dest_aux[100];
- strcpy(src_aux,src);
- strcpy(dest_aux,dest);
- struct stat fileStat;
- DIR *dirSrc;
- struct dirent *dirEntry;
- stat(src_aux,&fileStat);
- if(S_ISDIR(fileStat.st_mode)){
- makeFolder(src_aux,dest_aux,fileStat.st_mode);
- dirSrc = opendir(src_aux);
- while(dirEntry = readdir(dirSrc)){ //itereaza pe toate fisierele din director
- if((strcmp(dirEntry->d_name,".")!=0) && (strcmp(dirEntry->d_name,"..")!=0)){
- strcat(src_aux,"/");
- strcat(src_aux,dirEntry->d_name);
- parseDir(src_aux,dest_aux,mod); //apelare recursiva
- strcpy(src_aux,src); //suprascrierea caii cu cea veche, pentru intoarcere
- }
- }
- strcpy(dest_aux,dest); //suprascrierea caii cu cea veche, pentru intoarcere
- return ;
- }
- else if(S_ISREG(fileStat.st_mode)){
- if(mod == 0){ //copy file
- copyFileContents(src_aux, dest_aux, fileStat.st_mode, fileStat.st_size);
- }else{ //link file
- char filePath[100], fileName[100];
- getFileName(fileName,src_aux);
- strcpy(filePath,dest_aux);
- strcat(filePath,fileName);
- if(link(src_aux,filePath) == -1)
- printf("\nFisierul %s nu a putut fi link-uit\n",fileName);
- }
- return ;
- }
- }
- //executa programul in mod copiere/link [0/1]
- void dirCopy(int argc, char *argv[], int argvPos,int mod){
- char src[100], src_aux[100], dest[100];
- struct stat fileStat;
- DIR *dirSrc;
- struct dirent *dirEntry;
- strcpy(src,argv[1+argvPos]);
- strcpy(dest,argv[argvPos+2]);
- if(src[strlen(src)-1] == '/')
- src[strlen(src)-1] = '\0';
- if(dest[strlen(dest)-1] != '/')
- strcat(dest,"/");
- if(stat(src,&fileStat) == 0){
- strcpy(src_aux,src);
- if(S_ISDIR(fileStat.st_mode)){
- makeFolder(src_aux,dest,fileStat.st_mode);//creeaza folderul initial
- dirSrc=opendir(src_aux);
- while(dirEntry = readdir(dirSrc)){ // cat timp exista entry in folderul de baza
- if((strcmp(dirEntry->d_name,".")!=0) && (strcmp(dirEntry->d_name,"..")!=0)){
- strcat(src_aux,"/");strcat(src_aux,dirEntry->d_name);
- parseDir(src_aux,dest,mod);
- strcpy(src_aux,src);
- }
- }
- }
- closedir(dirSrc);
- }
- else
- {
- printf("\nCaile nu sunt valide \n");
- printf("1:%s\n2:%s\n",src,dest);
- exit(-1);
- }
- }
- //cauta flag -c sau -l
- int findFlag(char *argv[]){
- int cod = 0;
- if(strcmp(argv[1],"-c")==0)
- cod = 1;
- else if (strcmp(argv[1],"-l")==0)
- cod = 2;
- return cod;
- }
- int main(int argc, char *argv[]){
- switch(findFlag(argv)){
- case 0: // copiere implicit
- if(argc!=3){
- printf("Introduceti ca argumente : [-l/c]\tsursa\tdestinatie\n");
- exit(-1);
- }
- else{
- printf("Mod copiere\n");
- dirCopy(argc, argv, 0, 0);
- }
- break;
- case 1: //copiere explicit
- if(argc!=4){
- printf("Introduceti ca argumente : [-l/c]\tsursa\tdestinatie\n");
- exit(-1);
- }
- else{
- printf("Mod copiere explicit\n");
- dirCopy(argc, argv, 1, 0);
- }
- break;
- case 2: //link explicit
- if(argc!=4){
- printf("Introduceti ca argumente : [-l/c]\tsursa\tdestinatie\n");
- exit(-1);
- }
- else{
- printf("Mod link\n") ;
- dirCopy(argc, argv, 1, 1);
- }
- break;
- default:
- break;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement