== 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; 
} 













