U E D R , A S I H C RSS

데블스캠프2006/화요일/tar/김준석

No older revisions available

No older revisions available



== 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하는것
- 문제점
1. 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; 
} 

데블스캠프2006/화요일/tar
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:29:07
Processing time 0.0214 sec