nht_cntt

File part 1

Apr 14th, 2015
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.81 KB | None | 0 0
  1.     #include <stdio.h>
  2.     #include <conio.h>
  3.     #include <memory.h>
  4.     #include <malloc.h>
  5.     #include <string.h>
  6.      
  7.     #define MAX_CHAR        260
  8.     #define MAX_BUFFER        8192
  9.      
  10.     void get_file_name(const char* src_file, char* file_name)
  11.     {
  12.         int i;
  13.         char* p;
  14.         i = strlen(src_file);
  15.         while(i && src_file[--i] != '\\')
  16.         strcpy(file_name, src_file + i);
  17.     }
  18.      
  19.      
  20.     void get_ext_name(const char* src_file, char* ext)
  21.     {
  22.         int i;
  23.      
  24.         i = strlen(src_file);
  25.         while(i && src_file[--i] != '.');
  26.         strcpy(ext, src_file + i + 1);
  27.     }
  28.      
  29.     void remove_ext(char* src_name)
  30.     {
  31.         int i;
  32.         if(!src_name)
  33.             return;
  34.         i = strlen(src_name);
  35.         while(i && src_name[--i] != '.')
  36.             src_name[i] = '\0';
  37.         src_name[i] = '\0';
  38.     }
  39.     int split(const char* src_name, int count, const char* dest_path, int src_remove)
  40.     {
  41.         FILE* src_file;
  42.         unsigned char buffer[MAX_BUFFER];
  43.         int   buff_size;
  44.         int   file_size;
  45.         int   part_size;
  46.         int      remain;
  47.         int   current;
  48.      
  49.         if(count > 1)
  50.         {
  51.             src_file = fopen(src_name, "rb");
  52.             if(!src_file) // Không mở được file trả về 0
  53.                 return 0;
  54.             fseek(src_file, SEEK_SET, SEEK_END); //dời con trỏ về cuối file để
  55.             file_size = ftell(src_file); // lấy kích thước file
  56.             fseek(src_file, SEEK_SET, SEEK_SET); // dời con trỏ về đầu file để xử lý file
  57.             part_size = file_size / count; // chia file thành từng phần
  58.             remain = file_size % count; // phần còn dư
  59.            
  60.             current = 0; // biến đếm số file đc chia ra
  61.             while(current < count)
  62.             {
  63.                 int block;
  64.                 int remain_part;
  65.                 char file_part_name[MAX_CHAR];
  66.                 FILE* part;
  67.                 int     read;
  68.                 char full_path[MAX_CHAR];
  69.      
  70.                 get_file_name(src_name, file_part_name); // lấy tên file vd: c:\\file.exe -> file.exe
  71.                 sprintf(full_path, "%s%s.%0.3d", dest_path, file_part_name, current + 1); // full_path có dạng C:\\file.001, C:\\file.002, ...
  72.                 part = fopen(full_path, "wb"); // Mo file co dang .001, .002, ...            
  73.                 //Tối ưu hóa việc ghi file vào bộ đệm
  74.         block = part_size / MAX_BUFFER;
  75.                 remain_part = part_size % MAX_BUFFER;
  76.                
  77.                 while(block)
  78.                 {
  79.                     fread(buffer, 1, sizeof(buffer), src_file);
  80.                     fwrite(buffer, 1, sizeof(buffer), part);
  81.                     --block;
  82.                 }
  83.                 if(remain_part)
  84.                 {
  85.                     fread(buffer, 1, remain_part, src_file);
  86.                     fwrite(buffer, 1, remain_part, part);
  87.                 }
  88.         // ==> end.
  89.         // Ghi phần file thừa từ việc chia file
  90.                 if(current == count - 1)
  91.                 {
  92.                    
  93.                     if(remain)
  94.                     {
  95.                         unsigned char* buff;
  96.                         buff = (unsigned char *)malloc(remain);
  97.                         fread(buff, 1, remain, src_file);
  98.                         fwrite(buff, 1, remain, part);
  99.                         free(buff);
  100.                     }
  101.                 }
  102.                 fclose(part);
  103.                 ++current;
  104.             }        
  105.             fclose(src_file);
  106.             if(src_remove)
  107.                 remove(src_name);
  108.             return 1;
  109.         }
  110.         return 0;
  111.     }
  112.     int join(const char* src_001, const char* dest_path)
  113.     {
  114.         char ext[10];
  115.         FILE* file;
  116.         int i = 0;
  117.         char src_file[MAX_CHAR];
  118.         char dest_file[MAX_CHAR];
  119.      
  120.         strcpy(src_file, src_001);
  121.         file = fopen(src_001, "rb");
  122.         if(!file)
  123.             return 0;
  124.         fclose(file);
  125.        
  126.      
  127.         get_ext_name(src_001, ext);
  128.         if(strcmp(ext, "001"))
  129.             return 0;
  130.         ///
  131.         get_file_name(src_001, src_file);
  132.         remove_ext(src_file);
  133.         sprintf(dest_file, "%s%s", dest_path, src_file);
  134.      
  135.         file = fopen(dest_file, "wb");
  136.         if(!file)
  137.             return 0;
  138.      
  139.         while(1)
  140.         {
  141.             FILE* part;
  142.             int   part_size;
  143.             int   block;
  144.             int      remain;
  145.             unsigned char buffer[MAX_BUFFER];
  146.             char  part_name[MAX_CHAR];
  147.      
  148.             sprintf(part_name, "%s%s.%0.3d", dest_path, src_file, ++i);// giống cái trên
  149.             part = fopen(part_name, "rb");
  150.             if(!part)
  151.                 break;
  152.             fseek(part, SEEK_SET, SEEK_END);
  153.             part_size = ftell(part);
  154.             fseek(part, SEEK_SET, SEEK_SET);
  155.             block = part_size / sizeof(buffer);
  156.             remain = part_size % sizeof(buffer);
  157.             while(block)
  158.             {
  159.                 fread(buffer, 1, sizeof(buffer), part);
  160.                 fwrite(buffer, 1, sizeof(buffer), file);
  161.                 --block;
  162.             }
  163.             if(remain)
  164.             {
  165.                 fread(buffer, 1, remain, part);
  166.                 fwrite(buffer, 1, remain, file);
  167.             }
  168.             fclose(part);
  169.         }
  170.         fclose(file);
  171.         return 1;
  172.     }
  173.     int main(int argc, char* argv[])
  174.     {
  175.         if(split("C:\\x_man Random tran 1.rar", 4, "C:\\", 0)) // file mẫu "x_man Random tran 1.rar" chia làm 4 phần
  176.             printf("split file: done!\n");
  177.         if(join("E:\\x_man Random tran 1.rar.001", "C:\\"))
  178.             printf("Join files: done!\n");
  179.        
  180.         return 0;
  181.     }
Advertisement
Add Comment
Please, Sign In to add comment