== tar ==
폴더 안에있는 tar실행 그 폴더를 tar하는것
폴더 안에있는 tar실행 그 폴더를 tar하는것
~cpp #include<iostream> #include<stdio.h> #include<io.h> #include<stdlib.h> using namespace std; void main(){ _finddata_t data_dir; int h; int char_cpy; FILE *read_f,*write_f; if((write_f = fopen("Debug.tar","wb"))==NULL){ printf("파일이 열리지 않습니다.33"); return ; } if(!(-1==(h =_findfirst("tar\*",&data_dir)))) do { if((data_dir.attrib & _A_SUBDIR) != 0) continue; char fileName[1024]; sprintf(fileName, "..\tar\%s", data_dir.name); if((read_f = fopen(fileName,"rb"))==NULL){ printf("파일이 열리지 않습니다."); return ; } fwrite(data_dir.name, 270, 1, write_f); fprintf(write_f,"%d ",data_dir.size); while(!(EOF == (char_cpy = fgetc(read_f) ))){ fputc(char_cpy,write_f); } fclose(read_f); }while(!(_findnext(h,&data_dir))); else printf("There is no serching!"); fclose(write_f); }
== untar ==
폴더 안에있는 tar파일을 tar폴더에 해체하는것 ( untar )
~cpp #include<iostream> #include<stdio.h> #include<io.h> #include<stdlib.h> using namespace std; void main(){ char fileName[270]; char fileRoot[1024]; int output_size; int char_cpy; FILE *read_f,*write_f; if((read_f = fopen("..\devil25_tar\Debug.tar","rb"))==NULL){ printf("파일이 열리지 않습니다.(에러1)\n"); return ; } do { if (0 == fread(fileName, 270,1, read_f)) break; sprintf(fileRoot, "..\devil26_untar\untar\%s", fileName); if((write_f = fopen(fileRoot,"wb"))==NULL) { printf("파일이 열리지 않습니다.(에러2)\n"); return ; } fscanf(read_f,"%d ",&output_size); while(output_size--) { char_cpy = fgetc(read_f) ; fputc(char_cpy,write_f); } fclose(write_f); }while(1); fclose(read_f); }
== tar&untar ==
tar할 파일을 입력받고 그 파일이 폴더일경우 하위 파일과 디렉토리도 tar하는것
- 문제점
2. untar를 할경우 풀어놓을 폴더가 없을경우 에러
~cpp #include<iostream> #include<stdio.h> #include<io.h> #include<stdlib.h> #include<FCNTL.H> using namespace std; FILE *archive, *item; void check_dir(char *dir); int tar(char *file); int untar(char *file); int main(int argc, char *argv[]) { int h; _finddata_t data_dir; if(argc==2) untar(argv[1]); else if(argc>2) // tar { if((archive = fopen(argv[1],"wb"))==NULL) { printf("아카이브를 생성할 수 없습니다."); return 0; } for(int i = 2; i<argc;i++) { if(argv[1]==argv[i]) continue; // 같은 파일인지 검사 if(!(-1==(h =_findfirst(argv[i],&data_dir)))) { // argv[i]가 디렉토리인지 체크 // 디렉토리이면 하위 검사 if((data_dir.attrib & _A_SUBDIR) != 0) check_dir(argv[i]); else tar(argv[i]); //tar로 넘겨준다 이름과 파일 주소제어포인터를 } } fclose(archive); } else cout << "devil27_tar_untar [아카이브명] [압축할파일리스트]... 형식으로 해주세요.\n" << endl; return 0; } void check_dir(char *dir) { _finddata_t data_dir; char path[512]; int find_bool; char dir_ex[512]; strcpy(dir_ex, dir); strcat(dir_ex, "\*.*"); if(!(-1==(find_bool =_findfirst(dir_ex, &data_dir)))) { do { sprintf(path, "%s\%s", dir , data_dir.name); if(!strcmp(data_dir.name, ".") || !strcmp(data_dir.name, "..")) continue; else if(data_dir.attrib & _A_SUBDIR) check_dir(path); else tar(path); } while(!(_findnext(find_bool, &data_dir))); } } int tar(char *file) { char buffer[260]; long size; if((item = fopen(file,"rb"))==NULL) { printf("아카이브를 생성할 파일을 열 수 없습니다.\n"); return 0; } size = _filelength(_fileno(item)); fwrite(file, sizeof(char), 512, archive); fprintf(archive, "%d ", size); while(1) { if(!fread(buffer, 256, 1, item)) break; fwrite(buffer, 256, 1, archive); } fclose(item); return 0; } int untar(char *file) { char buffer[260]; int size; char path[512]; if((archive = fopen(file,"rb"))==NULL) { printf("아카이브 파일을 열 수 없습니다.\n"); return 0; } while(!feof(archive)) { if(!fread(path, 512, 1, archive)) break; if((item =fopen(path,"wb"))==NULL) { printf("파일을 생성할 수 없습니다.\n"); return 0; } fscanf(archive, "%d ", &size); while(1) { if(!fread(buffer, 256, 1, archive)) break; fwrite(buffer, 256, 1, item); } _chsize(_fileno(item), size); fclose(item); } fclose(archive); return 0; }