nht_cntt

File part 2

Apr 16th, 2015
390
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.89 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 part_size, const char* dest_path, int src_remove) // part_size có đơn vị là byte. src_remove chọn xóa hoặc không xóa file nguồn.
  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.         int count = 0;
  49.      
  50.         if(part_size > 0 )
  51.         {
  52.             src_file = fopen(src_name, "rb");
  53.             if(!src_file) // Không mở được file trả về 0
  54.                 return 0;
  55.             fseek(src_file, SEEK_SET, SEEK_END); //dời con trỏ về cuối file để
  56.             file_size = ftell(src_file); // lấy kích thước file
  57.             fseek(src_file, SEEK_SET, SEEK_SET); // dời con trỏ về đầu file để xử lý file
  58.             count = file_size / part_size ; // chia file thành từng phần
  59.             remain = file_size % part_size; // phần còn dư
  60.            
  61.             current = 0; // biến đếm số file đc chia ra
  62.             while(current <= count)
  63.             {
  64.                 int block;
  65.                 int remain_part;
  66.                 char file_part_name[MAX_CHAR];
  67.                 FILE* part;
  68.                 int     read;
  69.                 char full_path[MAX_CHAR];
  70.      
  71.                 get_file_name(src_name, file_part_name); // lấy tên file vd: c:\\file.exe -> file.exe
  72.                 sprintf(full_path, "%s%s.part%3d", dest_path, file_part_name, current + 1); // full_path có dạng C:\\file.part1, C:\\file.part2, ...
  73.                 part = fopen(full_path, "wb"); // Mo file co dang .part1, .part2, ... để ghi.          
  74.                 //Tối ưu hóa việc ghi file vào bộ đệm
  75.                 block = part_size / MAX_BUFFER;
  76.                 remain_part = part_size % MAX_BUFFER;
  77.                //==> 1
  78.                 // Ghi phần file dư còn lại
  79.                 if(current == count)
  80.                 {
  81.                    
  82.                     if(remain)
  83.                     {
  84.                         unsigned char* buff;
  85.                         buff = (unsigned char *)malloc(remain);
  86.                         fread(buff, 1, remain, src_file);
  87.                         fwrite(buff, 1, remain, part);
  88.                         free(buff);
  89.                     }
  90.                 }
  91.                 // ==> Kết thúc việc ghi
  92.                 else
  93.                 {
  94.                     // 1 ==> 2
  95.                     while(block)
  96.                     {
  97.                         fread(buffer, 1, sizeof(buffer), src_file);
  98.                         fwrite(buffer, 1, sizeof(buffer), part);
  99.                         --block;
  100.                     }
  101.                     if(remain_part)
  102.                     {
  103.                         fread(buffer, 1, remain_part, src_file);
  104.                         fwrite(buffer, 1, remain_part, part);
  105.                     }
  106.                     // ==> End
  107.                 }
  108.                 fclose(part);
  109.                 ++current;
  110.             }        
  111.             fclose(src_file);
  112.             if(src_remove) // Xóa file nếu có
  113.                 remove(src_name);
  114.             return 1;
  115.         }
  116.         return 0;
  117.     }
  118.     int join(const char* src_001, const char* dest_path)
  119.     {
  120.         char ext[10];
  121.         FILE* file;
  122.         int i = 0;
  123.         char src_file[MAX_CHAR];
  124.         char dest_file[MAX_CHAR];
  125.      
  126.         strcpy(src_file, src_001);
  127.         file = fopen(src_001, "rb");
  128.         if(!file)
  129.             return 0;
  130.         fclose(file);
  131.        
  132.      
  133.         get_ext_name(src_001, ext);
  134.         if(strcmp(ext, "001"))
  135.             return 0;
  136.         ///
  137.         get_file_name(src_001, src_file);
  138.         remove_ext(src_file);
  139.         sprintf(dest_file, "%s%s", dest_path, src_file);
  140.      
  141.         file = fopen(dest_file, "wb");
  142.         if(!file)
  143.             return 0;
  144.      
  145.         while(1)
  146.         {
  147.             FILE* part;
  148.             int   part_size;
  149.             int   block;
  150.             int      remain;
  151.             unsigned char buffer[MAX_BUFFER];
  152.             char  part_name[MAX_CHAR];
  153.      
  154.             sprintf(part_name, "%s%s.%0.3d", dest_path, src_file, ++i);// giống cái trên
  155.             part = fopen(part_name, "rb");
  156.             if(!part)
  157.                 break;
  158.             fseek(part, SEEK_SET, SEEK_END);
  159.             part_size = ftell(part);
  160.             fseek(part, SEEK_SET, SEEK_SET);
  161.             block = part_size / sizeof(buffer);
  162.             remain = part_size % sizeof(buffer);
  163.             while(block)
  164.             {
  165.                 fread(buffer, 1, sizeof(buffer), part);
  166.                 fwrite(buffer, 1, sizeof(buffer), file);
  167.                 --block;
  168.             }
  169.             if(remain)
  170.             {
  171.                 fread(buffer, 1, remain, part);
  172.                 fwrite(buffer, 1, remain, file);
  173.             }
  174.             fclose(part);
  175.         }
  176.         fclose(file);
  177.         return 1;
  178.     }
  179.     int main(int argc, char* argv[])
  180.     {
  181.         if(split("123.mp4", 400*1024, "C:\\1\\", 0)) // file mẫu "x_man Random tran 1.rar" chia làm 4 phần
  182.             printf("split file: done!\n");
  183.        // if(join("C:\\1\\123.mp4.001", "C:\\"))
  184.          //   printf("Join files: done!\n");
  185.        
  186.         return 0;
  187.     }
Advertisement
Add Comment
Please, Sign In to add comment