⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 分割文件程序.txt

📁 一个文件分割程序
💻 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 + -