拷贝文件的三种方法源代码

简介: (1) 使用ANSI C的库函数       可以使用ANSI C的以下几个库函数:       FILE *fopen( const char *filename, const char *mode );       int fclose( FILE *stream );    size_t fr...
(1) 使用ANSI C的库函数
   
    可以使用ANSI C的以下几个库函数:   
    FILE *fopen( const char *filename, const char *mode );   
    int fclose( FILE *stream );
    size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
    size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

   示例源码如下:


/*
    cpc.c
    use c library to copy file
*/

#include <stdio.h>
#include <errno.h>

#define BUF_SIZE    256

int main(int argc, char *argv[])
{
    FILE *in_file, *out_file;
    char data[BUF_SIZE];
    size_t bytes_in, bytes_out;
    long len = 0;

    if ( argc != 3 )
    {
        printf("Usage: %s file1 file2\n", argv[0]);
        return 1;
    }

    if ( (in_file = fopen(argv[1], "rb")) == NULL )
    {
        perror(argv[1]);
        return 2;
    }
    if ( (out_file = fopen(argv[2], "wb")) == NULL )
    {
        perror(argv[2]);
        return 3;
    }


    while ( (bytes_in = fread(data, 1, BUF_SIZE, in_file)) > 0 )
    {
        bytes_out = fwrite(data, 1, bytes_in, out_file);
        if ( bytes_in != bytes_out )
        {
            perror("Fatal write error.\n");
            return 4;
        }
        len += bytes_out;
        printf("copying file .... %d bytes copy\n", len);
    }

    fclose(in_file);
    fclose(out_file);

    return 0;
}

2. 使用Windows 32 API 函数
   主要用到以下几个函数:
   HANDLE CreateFile( LPCTSTR lpFileName,
                      DWORD dwDesiredAccess,
                      DWORD dwShareMode,
                      LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                      DWORD dwCreationDispostion ,
                      DWORD dwFlagsAndAttributes,
                      HANDLE hTemplateFile);
   BOOL ReadFile( HANDLE hFile,
                  LPVOID lpBuffer,
                  DWORD nNumberOfBytesToRead,
                  LPDWORD lpNumberOfBytesRead,
                  LPOVERLAPPED lpOverlapped);
   BOOL WriteFile( HANDLE hFile,
                   LPCVOID lpBuffer,
                   DWORD nNumberOfBytesToWrite,
                   LPDWORD lpNumberOfBytesWritten,
                   LPOVERLAPPED lpOverlapped);

   示例代码如下:
  

/*    
    cpw.c
    copy file, use windows functions
*/

#include <windows.h>
#include <stdio.h>

#define    BUF_SIZE    256

int main(int argc, LPTSTR argv[])
{
    HANDLE hIn, hOut;
    DWORD dwIn, dwOut;
    TCHAR Data[BUF_SIZE];
    DWORD dwLen = 0;

    if ( argc != 3 )
    {
        printf("Usage : %s file1 file2\n", argv[0]);
        return 1;
    }

    hIn = CreateFile(argv[1], GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if ( INVALID_HANDLE_VALUE == hIn )
    {
        printf("Can't open open file %s : %x\n",
            argv[1], GetLastError());
        return 2;
    }

    hOut = CreateFile(argv[2], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL, NULL);
    if ( INVALID_HANDLE_VALUE == hOut )
    {
        printf("Can't open file : %s: %x\n",
            argv[2], GetLastError());
        return 3;
    }

    while ( ReadFile(hIn, Data, BUF_SIZE, &dwIn, NULL) > 0)
    {
        WriteFile(hOut, Data, dwIn, &dwOut, NULL);
        if ( dwIn != dwOut )
        {
            printf("Fatal Error: %x\n", GetLastError());
            return 4;
        }
        dwLen += dwIn;
        printf("Copying file .... %d bytes copy\n", dwLen);
    }

    CloseHandle(hIn);
    CloseHandle(hOut);
    
    return 0;
}

3. 直接使用Windows的拷贝函数,实际上也是api函数,这个使用效率最高也最简单

BOOL CopyFile( LPCTSTR lpExistingFileName,
               LPCTSTR lpNewFileName,
               BOOL bFailIfExists );

可是这个灵活性不高,但是使用上确是最简单的示例代码如下:

/*
cpwf.c
copy file with windows function CopyFile
*/

#include <windows.h>
#include <stdio.h>

int main(int argc, LPTSTR argv[] )
{
    if ( argc != 3 )
    {
        printf("Usage %s file1 file2\n", argv[0]);
        return 1;
    }
    
    if ( !CopyFile(argv[1], argv[2], FALSE) )
    {
        printf("Copy file error : %x\n", GetLastError());
        return 2;
    }
    return 0;
}

前两种方法都遵循以下的步骤
1. 打开源文件, fopen或者CreateFile
2. 打开目标文件, fopen 或者 CreateFile
3. 读文件,如果无误,则将读出的数据写入到新文件,循环这个过程,直到文件结束
   用fread或者ReadFile读,用fwrite或者WriteFile写
4. 关闭源文件和目标文件,fclose或者CloseHandle

最后一种方法,用了一个Windows API函数就是CopyFile,实际上它就是把第一种或者第二种方法写成了一个函数。
这3种方法均在VC++6.0下测试通过。 第一种方法在linux下用gcc测试通过。

其中第一种方法最具有通用性,由于使用了ANSI C标准库函数,所以,可以不修改任何代码在linux下编译通过。
目录
相关文章
|
iOS开发 MacOS Windows
【Mac 系统】如何在office的Word中使用LaTeX公式
一个在Mac版Microsoft Word中使用LaTeX语法插入公式的间接方法,通过Pages文稿创建和编辑LaTeX公式后再复制到Word中。
1061 2
|
9月前
|
定位技术
项目干系人沟通技巧:心理学观点
和项目干系人的有效沟通需明确沟通目标、分析干系人影响力及需求,运用心理学效应如框架效应、社会认同、同理心、互惠原则和锚定效应,以促进项目顺利进行。
134 3
|
SQL Java API
使用 JPA 有哪些优点?
【8月更文挑战第21天】
267 0
|
机器学习/深度学习 消息中间件 算法
Flink ML的新特性解析与应用
本文整理自阿里巴巴算法专家赵伟波,在 Flink Forward Asia 2023 AI特征工程专场的分享。
130055 5
Flink ML的新特性解析与应用
|
测试技术 API
接口设计原则与最佳实践指南
接口设计原则与最佳实践指南
|
机器学习/深度学习 存储 算法
注意力机制(一)(基本思想)
在注意力机制论文 Attention Is All You Need 中最苦恼大家的肯定是K、Q、V三个变量的含义 翻阅了CSDN、知乎大量文章后,我发现没有文章能够带大家对注意力机制建立直观的认识 大部分文章要么没有从初学者的角度出发介绍的是注意力机制上层应用,要么其作者自己也并没有真正理解注意力机制所以讲的不清不楚 所以在看完《动手学深度学习(pytorch版)》、Attention Is All You Need 论文、以及大量文章后,我开始动手写这篇专门为初学者的介绍注意力机制的文章 权
|
设计模式 IDE Java
谈谈过度设计:因噎废食的陷阱
写软件和造楼房一样需要设计,但是和建筑行业严谨客观的设计规范不同,软件设计常常很主观,且容易引发争论。
2873 4
谈谈过度设计:因噎废食的陷阱
|
Unix Linux 应用服务中间件
【Linux】Linux 系统编程——相对路径和绝对路径
【Linux】Linux 系统编程——相对路径和绝对路径
484 1
|
SQL 安全 Java
网络安全面试题及经验分享(第一期)
本文原文来自:i春秋,转载以供自己复习使用,下面题目都是来自2023年面试题目和答案解析,题目是学员们真实的面试经历分享,具有很高的参考价值。
|
算法 C# 数据安全/隐私保护
C# | AES加解密 - 快速上手
这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一 。 AES作为计算机领域最常见的通用加密算法之一,称之为对称加密算法中的一哥也丝毫不为过,其重要程度不言而喻。 本文将极尽详细的讲解C#实现AES加密和解密的全过程。
714 0
C# | AES加解密 - 快速上手