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

(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下编译通过。

时间: 2024-10-31 09:39:10

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

asp.net读取excel文件的三种方法示例

 这篇文章主要介绍了asp.net读取excel文件的三种方法示例,包括采用OleDB读取Excel文件.引用的com组件读取Excel文件.用文件流读取,需要的朋友可以参考下 方法一:采用OleDB读取Excel文件   把Excel文件当做一个数据源来进行数据的读取操作,实例如下:  代码如下: public DataSet ExcelToDS(string Path)    {    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;&q

解析PHP生成静态html文件的三种方法_php技巧

本文将介绍Php 生成静态html文件的三种方法 .1,下面使用模版的一个方法! 复制代码 代码如下: <?php $fp = fopen ("templets.html","a"); if ($fp){ $fup = fread ($fp,filesize("templets.html")); $fp2 = fopen ("html.shtml","w"); if ($fwrite ($fp2,$f

PHP把网页保存为word文件的三种方法

 最近工作遇到关于生成word的问题,现在总结一下生成word的三种方法的相关资料,需要的朋友可以参考下 一.PHP生成word的两种思路或原理   1.利用windows下面的 com组件 2.利用PHP将内容写入doc文件之中 具体实现方法如下.   二.利用windows下面的com组件   原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word.application的com,可以自动生成文档,PHP官方文档手册:http://www.php.net/manua

PHP把网页保存为word文件的三种方法_php实例

一.PHP生成word的两种思路或原理 1.利用windows下面的 com组件2.利用PHP将内容写入doc文件之中具体实现方法如下. 二.利用windows下面的com组件 原理:com作为PHP的一个扩展类,安装过office的服务器会自动调用word.application的com,可以自动生成文档,PHP官方文档手册:http://www.php.net/manual/en/class.com.php 使用官方实例: 复制代码 代码如下: <?php// starting word$w

如何删除Linux一个目录下部分类型之外的所有文件的三种方法

有的时候,你可能会遇到这种情况,你需要删除一个目录下的所有文件,或者只是简单的通过删除除了一些指定类型(以指定扩展名结尾)之外的文件来清理一个目录. 在这篇文章,我们将会向你展现如何通过 rm. find 和 globignore 命令删除一个目录下除了指定文件扩展名或者类型的之外的文件. 在我们进一步深入之前,让我们开始简要的了解一下 Linux 中的一个重要的概念 -- 文件名模式匹配,它可以让我们解决眼前的问题. 在 Linux 下,一个 shell 模式是一个包含以下特殊字符的字符串,称

删除一个目录下部分类型之外的所有文件的三种方法

有的时候,你可能会遇到这种情况,你需要删除一个目录下的所有文件,或者只是简单的通过删除除了一些指定类型(以指定扩展名结尾)之外的文件来清理一个目录. 在这篇文章,我们将会向你展现如何通过 rm. find 和 globignore 命令删除一个目录下除了指定文件扩展名或者类型的之外的文件. 在我们进一步深入之前,让我们开始简要的了解一下 Linux 中的一个重要的概念 -- 文件名模式匹配,它可以让我们解决眼前的问题. 在 Linux 下,一个 shell 模式是一个包含以下特殊字符的字符串,称

系统中打开文件的三种方法汇总

  打开磁盘上的文件,是我们对文件进行操作的第一步.但是,由于计算机病毒猖獗,不少病毒都是在我们双击鼠标时被激活的,因此,即使是这样一个简单的操作,都需要格外小心.打开文件主要有以下几种方式,我们来分析一下它们的安全性. 第一种,双击鼠标左键打开 这种方式打开文件,安全系数最低.大家可能早已认识到这一点,因为,病毒程序经常被我们的这个习惯性操作激活. 第二种,单击鼠标右键打开 这种方式打开文件,安全系数要比第一种方式高,但也存在危险性.因为现在的病毒可以通过鼠标右键中的命令来运行. 第三种,用资

.NET读取Excel文件的三种方法的区别_实用技巧

ASP.NET读取Excel文件方法一:采用OleDB读取Excel文件: 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: 复制代码 代码如下: public DataSet ExcelToDS(string Path)   {    string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Prop

asp.net读取excel文件的三种方法示例_实用技巧

方法一:采用OleDB读取Excel文件 把Excel文件当做一个数据源来进行数据的读取操作,实例如下: 复制代码 代码如下: public DataSet ExcelToDS(string Path)   {   string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" +"Data Source="+ Path +";"+"Extended Properties=Excel 8.0;&