📄 分割文件程序.txt
字号:
/*分割文件程序,*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const size_t block_sz = 1024; /* 按块来读文件,每个块的大小*/
typedef struct f_inf {
/*源文件:*/
char *name; /*文件名 */
FILE *fp; /*文件指针 */
long len; /* 文件长度 */
char *tmp; /*缓冲区,大小为block_sz*/
/*分割出的文件:*/
char *cur_name; /*当前正在写入的分割成的文件名 */
FILE *cur_fp; /*当前正在写入的文件指针*/
long cur_len; /*当前已写入的文件长度 */
long blocks_per_part;
/* 每个分割成的文件是多少块
* blocks_per_part * blcok_sz就是分割成的文件大小
*/
/*产生的记录分割信息的ini文件:*/
char *ini_name; /*产生的ini文件名*/
FILE *ini_fp; /* ini 文件指针 */
} f_inf_t;
#define ERR_MSG(msg) fprintf(stderr,"Error found in "\
"file :%s line: %d "\
"reason:%s"\
,__FILE__\
,__LINE__\
,(msg))
/*给dst分配空间,并将其用name来初始化*/
char *init_name(char *dst,char *name)
{
dst = (char *) malloc( ( strlen(name) + 1)* sizeof(char) );
if(!dst)
{
ERR_MSG("No enough memory\n");
exit(1);
}
strcpy(dst,name);
return dst;
}
/*将文件name以 model的形式打开*/
FILE *open_file(char *name,char *model)
{
char er_msg[300];
FILE *fp = fopen(name,model);
if(!fp)
{
sprintf(er_msg,"Can not open file\"%s\"",name);
ERR_MSG(er_msg);
exit(1);
}
return fp;
}
/*形成形如 namesufix的文件名*/
char * form_name(char *name,char *sufix)
{
size_t len;
size_t suf_len;
char *new_name;
len = strlen(name);
suf_len = strlen(sufix);
new_name=(char*)malloc(len + suf_len +1); /* 因为有'\0'*/
if(!new_name)
{
ERR_MSG("No enough memory\n");
exit(1);
}
strcpy(new_name,name);
strcpy(new_name+len,sufix);
free(name);
return new_name;
}
/*得到文件fp的长度*/
long get_length(FILE *fp)
{
long len =0;
fseek(fp,0,2);
len =ftell(fp);
rewind(fp);
return len;
}
/* 初始化文件信息:
*用被分割的文件名和想分 割成的文件所占的块数
*/
int init_file(f_inf_t *file,char *name,int blocks_per_part)
{
/*初始化所有指针*/
file->name = NULL;
file->fp = NULL;
file->tmp = NULL;
file->cur_name = NULL;
file->cur_fp = NULL;
file->ini_name = NULL;
file->ini_fp = NULL;
file->blocks_per_part = blocks_per_part;
file->cur_len = 0;
/*将所有文件名用name来初始化*/
file-> name = init_name(file-> name,name);
file-> cur_name = init_name(file-> cur_name,name);
file-> ini_name = init_name(file-> ini_name,name);
/*处理源文件:*/
file->fp = open_file(file-> name,"rb");
file->len = get_length(file->fp);
/*申请缓冲区*/
file -> tmp = (char *)malloc( block_sz *sizeof(char));
if(!file->tmp)
{
ERR_MSG("No enough memory\n");
exit(1);
}
return 0;
}
int cut(f_inf_t *file)
{
int blocks=0; /*当前分割文件已写入的块数 */
size_t read_sz=0; /*当前读出块的字节数 */
size_t write_sz = 0; /*当前写入的字节数 */
int cur_part =0; /*当前正在分割形成的第cur_part块文件*/
char i2a_buf[10]; /*cur_part 的字符串形式*/
int end_of_file =0; /*文件末尾标志*/
/*分割出来的文件所形成的信息文件*/
file -> ini_name = form_name(file->ini_name,".ini");
file -> ini_fp = open_file(file->ini_name,"wt");
fprintf(file->ini_fp,"%s\n",file->name);
while(!end_of_file)
{
/*形成像file.123一样的文件名*/
strcpy(file->cur_name,file->name);
itoa(cur_part,i2a_buf,10);
file->cur_name = form_name(file->cur_name,".");
file->cur_name = form_name(file->cur_name,i2a_buf);
file->cur_fp=open_file(file->cur_name,"wb");
while( (cur_part+1)*file->blocks_per_part > blocks )
{
read_sz = fread(file->tmp,1,block_sz,file->fp);
write_sz = fwrite(file->tmp,1,read_sz,file->cur_fp);
/*如果读出的大小并不是我们想读出来
*的字节数,就是文件到尾部了
*/
if( read_sz != write_sz)
{
ERR_MSG("Can not write .\n");
exit(1);
}
file->cur_len += read_sz ;
++blocks;
if(read_sz != block_sz)
{
end_of_file = 1;
break;
}
}
++cur_part;
fclose(file->cur_fp);
file->cur_fp =NULL;
fprintf(file->ini_fp,"%s\n",file->cur_name);
/*写入分割信息*/
}
if( file->len != file->cur_len ) /*没有将源文件读完就退出了*/
{
ERR_MSG("Unknown error\n");
exit(1);
}
return 0;
}
void rls(f_inf_t *file)
{
free(file-> name);
free(file-> cur_name);
free(file-> ini_name);
free(file-> tmp);
if(file->fp)
{ fclose(file->fp); }
if(file->cur_fp)
{ fclose(file->cur_fp); }
if( file->ini_fp)
{ fclose(file->ini_fp); }
}
void help(void);
int main(int argc,char *argv[])
{
f_inf_t spilt;
if(argc != 3)
{
help();
exit(1);
}
init_file(&spilt,argv[1],atoi(argv[2])) ;
cut(&spilt);
printf("%ld bytes have been spilt\n",spilt.cur_len);
rls(&spilt);
return 0;
}
void help(void)
{
fprintf(stderr,"spilt :spilt a file into size(kb)\n"
"Usage:\n"
"spilt file size(kb)\n"
"E.G: spilt noitce.txt 1\n");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -