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