zoukankan      html  css  js  c++  java
  • 文件复制二进制版

    两种复制方式:

    FILE *src = fopen("src.txt","r");

    FILE *dest = fopen("dest.txt","w");

    Char buf[1024]={0};

    While(!feof(src)){

    Size_t size = fread(buf,1,sizeof(buf),src);

    Fwrite(buf,1,size,dest);

    }

     

    采用 stat函数

    #include <sys/stat.h>

    Struct stat st;

    stat("src.txt",&st);

    char buf[] = malloc(st.st_size);

    fread(buf,st.st_size,1,src);

    fwrite(buf,st.st_size,1,dest);

    //记得释放内存

    Free(buf);

     

     

     

    这两种写法都是可以的,第二种是通过空间换时间。因为他就执行一次,所以速度很快效率很高。但是文件不能很大,所以可以做一个判断,如果文件在多大范围之内,就采用这个方式来复制,利用空间换取时间。

    第一种写法是一种通吃的写法,都可以完成复制,只是速度上会比第二个慢。好处是多大都能完成复制。

    但是我们一般这个缓冲区也有说法,不做的太大,也不做的太小。

    太大可能造成缓冲区的浪费,太小的话移动次数会过多。

    所以经过比较长久的这样一种尝试和考量决定把这个数字设定在64*1024.也就是64k。一般内存页就是64k的大小了。

     

     

    下面给出一个文件复制的简单版本。当然还没有试过多大之内可以使用stat函数,并且也没有做出递归。

    先来尝试文件大小的部分。

     

    main.c

    #include <stdio.h>
    #include <sys/stat.h>
    #pragma warning(disable:4996)
    
    #define MAXSIZE4FUNC2 1038684887//一个已经检测过的大小为990Mb的zip文件。这个数是10亿个字节,所以感觉1G以内的文件都可以的。
    #define _1G 1073741824//这是计算得到的1G=1073741824个字节。
    #include "func1.h"
    #include "func2.h"
    
    /** 
    
        可以做成双击执行版本的。
        单个文件,还要迭代?
        判断当前是文件还是目录
    
    */
    void workflow(const int,const char **);
    void judgeEntrance(const char **argv, const FILE *src, FILE *dest);
    int main(int argc,char **argv){
        
        workflow(argc,argv);
    
        //FILE *src = fopen("a.txt", "r");
        //FILE *dest = fopen("2b.txt", "w");
        //copy1(src, dest);
        //copy2("a.txt", src, dest);
        //fclose(src);
        //fclose(dest);
    
        return 0;
    }
    
    void workflow(const int argc, const char **argv){
        if (argc < 3){
            printf("参数过少,需要三个参数");
        }
        else if (argc>3){
            printf("参数过多,需要三个参数");
        }
        else{
        
            FILE *src = fopen(argv[1], "rb");
            FILE *dest = fopen(argv[2], "wb");
            judgeEntrance(argv,src,dest);
            fclose(src);
            fclose(dest);
        }
    }
    void judgeEntrance(const char **argv,const FILE *src,FILE *dest){
    
        struct stat st;
        stat(argv[1], &st); 
        if (st.st_size < _1G){//空间换时间的做法
            copy2(argv[1], src, dest);
        }
        else{//通配的做法
            copy1(src, dest);
        }
        printf("%d", st.st_size);
    }

    func1.h

    #ifndef _FUNC1_H
    #define _FUNC1_H
    #include <stdio.h>
    
    void copy1(FILE *src, FILE *dest);
    
    #endif 

    func1.c

    #include <stdio.h>
    
    void copy1(FILE *src, FILE *dest){
        char buf[1024 * 64] = { 0 };
        while (!feof(src)){
            size_t size = fread(buf, 1, sizeof(buf), src);
            fwrite(buf, 1, size, dest);
        }
    }

    func2.h

    #ifndef _FUNC2_H
    #define _FUNC2_H
    #include <stdio.h>
    
    void copy2(const char *srcstrname, const FILE *src, FILE *dest);
    
    #endif

    func2.c

    #include <sys/stat.h>
    #include <stdio.h>
    
    void copy2(const char *srcstrname, const FILE *src, FILE *dest){
        struct stat st;
        stat(srcstrname, &st);
        char *buf = malloc(st.st_size);
        fread(buf, st.st_size, 1, src);
        fwrite(buf, st.st_size, 1, dest);
        free(buf);
    }

     

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    年轻人如何创业?有什么好的建议?
    青年创新创业大赛北京赛区总决赛举行
    90后瘫痪女孩靠创业改变人生
    怎么利用淘宝赚钱?具体方法有哪些?
    淘宝赚钱的方法有哪些?做淘宝要注意哪些?
    现在做淘宝赚钱吗?要注意哪些?
    2019年开淘宝店赚钱吗?需要注意什么?
    淘宝赚钱软件有哪些?具体怎么赚钱?
  • 原文地址:https://www.cnblogs.com/letben/p/5252180.html
Copyright © 2011-2022 走看看