Windows中文件读写的几种方式

8 阅读2分钟

使用C语言进行文件读写

主要用到两个函数freadfwrite

代码

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

#define BUF_SIZE 256

int main(int argc, char* argv[]) {
    FILE* inFile;  // 输入的文件
    FILE* outFile;   // 输出的文件
    char rec[BUF_SIZE]; // 创建一个缓冲区,用于读写
    size_t bytesIn;    // 实际读取的字节数
    size_t bytesOut;   // 实际写入的字节数

    if (argc != 3) {
        printf("参数错误,没有输入源文件或者目标文件");
        return 1;
    }

    // 打开要被复制的文件, rb二进制形式打开
    errno_t err = fopen_s(&inFile, argv[1], "rb");

    if (err != 0) {
        perror(argv[1]);
        return 2;
    }


    // 打开输出的文件,如果没有则会创建
    err = fopen_s(&outFile, argv[2], "wb");

    if (err != 0) {
        perror(argv[2]);
        return 3;
    }

    // 开始读取文件
    while ((bytesIn = fread(rec, 1, BUF_SIZE, inFile)) > 0) {
        // 将读到的内容输出到文件里
        bytesOut = fwrite(rec, 1, bytesIn, outFile);

        if (bytesIn != bytesOut) {
            // 读取的和写入的数据量不相等,说明出错了
            perror("Fatal write error");
            return 4;

        }
    }

    // 关闭文件指针

    fclose(inFile);
    fclose(outFile);


    return 0;
}

使用Windows API进行读写

主要用到CreateFileWriteFile

代码

#include <Windows.h>
#include <stdio.h>

#define BUF_SIZE 256


int main(int argc, LPTSTR argv[]) {
    HANDLE hIn, hOut;  // 输入和输出的文件句柄
    DWORD nIn, nOut;  // 实际读取和输入的数据量

    CHAR buffer[BUF_SIZE];


    if (argc != 3) {
        printf("参数错误,没有输入源文件或者目标文件");
        return 1;
    }

    // 打开输入文件

    hIn = CreateFile(
        argv[1],   // 要打开的文件
        GENERIC_READ,  // 读方式打开该文件
        FILE_SHARE_READ, // 文件共享读
        NULL,        //  默认的安全属性
        OPEN_EXISTING, // 打开已存在的文件
        FILE_ATTRIBUTE_NORMAL, // 常规的文件属性
        NULL
        );


    if (hIn == INVALID_HANDLE_VALUE) {
        printf("can not open input file. Error: %x\n", GetLastError());
        return 2;
    }

    // 打开输出文件

    hOut = CreateFile(
        argv[2],   // 要写入的文件
        GENERIC_WRITE,  // 写方式打开该文件
        0,
        NULL,
        CREATE_ALWAYS,        //  总是创建新的文件
        FILE_ATTRIBUTE_NORMAL, // 常规的文件属性
        NULL
    );


    if (hOut == INVALID_HANDLE_VALUE) {
        printf("can not open output file. Error: %x\n", GetLastError());
        return 3;
    }


    // 开始读取文件

    while (ReadFile(hIn, buffer, BUF_SIZE, &nIn, NULL) && nIn > 0) {
        // 将读取的内容写入到文件中
        WriteFile(hOut, buffer, nIn, &nOut, NULL);

        if (nIn != nOut) {
            // 如果读取的和写入的不相等
            printf("Fatal write error: %x\n", GetLastError());
            return 4;
        }
    }


    // 关闭文件句柄
    CloseHandle(hIn);
    CloseHandle(hOut);



    return 0;
}

直接拷贝文件

我们使用CopyFile直接拷贝文件,最简便

代码

#include <Windows.h>
#include <stdio.h>

int main(int argc, LPTSTR argv[]) {
    if (argc != 3) {
        printf("参数错误,没有输入源文件或者目标文件");
        return 1;
    }

    if (!CopyFile(argv[1], argv[2], FALSE)) {
        printf("Copy file error: %x\n", GetLastError());
        return 2;
    }

    return 0;
}