ReadFile/WriteFile 崩溃

ReadFile/WriteFile crahes

下一个 ReadFile/WriteFile 代码有问题。 我需要通过使用此功能来使用复制文件(是的,最好使用 CopyFile,但现在我需要它),但它在 read/write 循环时崩溃了。 有什么问题吗?

PS C:\Users\user\Documents\SysLab1\dist\Debug\MinGW-Windows> g++ --version g++.exe (x86_64-posix-sjlj-rev0, Built by MinGW-W64 project) 4.8.3

我使用了下一个代码:

#include <windows.h>

#include <iostream>

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

#define BLOCK_SIZE 1024

uint32_t copy_c(char* source, char* destination) {...}

uint32_t copy_api_readwrite(char* source, char* destination) {
    bool result;
    HANDLE input = CreateFile(source, GENERIC_READ, 0, NULL, 
        OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (input!=INVALID_HANDLE_VALUE) {
        HANDLE output = CreateFile(destination, GENERIC_WRITE, 0, NULL,
            CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if(output!=INVALID_HANDLE_VALUE) {
            DWORD readed;
            char block[BLOCK_SIZE];
            while(ReadFile(input, block, BLOCK_SIZE * sizeof(char), &readed, NULL)>0) {
                WriteFile(output, block, readed, NULL, NULL);
            }
            if(GetLastError()==ERROR_HANDLE_EOF) {
                result = true;
            }
            else {
                result = false;
            }
            CloseHandle(output);
        }
        else {
            result = false;
        }
        CloseHandle(input);
    }
    else {
        result = true;
    }

    if(result) {
        return 0;
    }
    else {
        return GetLastError();
    }
    return result;
}

uint32_t copy_api(char* source, char* destination) {...}

#define COPY_READWRITE

#ifdef COPY_C 
#define COPY copy_c
#else
#ifdef COPY_READWRITE
#define COPY copy_api_readwrite
#else
#ifdef COPY_API
#define COPY copy_api
#endif
#endif
#endif

int main(int argc, char** argv) {
    if(argc<3) {
        std::cout << "Bad command line arguments\n";
        return 1;
    }

    uint32_t result = COPY(argv[1], argv[2]);
    if(result==0) {
        std::cout << "Success\n";
        return 0;
    }
    else {
        std::cout << "Error : " << result << "\n";
        return 2;
    }
}

来自WriteFiledocumentation

lpNumberOfBytesWritten

This parameter can be NULL only when the lpOverlapped parameter is not NULL.

您不符合该要求。您将必须传递 DWORD 变量的地址,写入的字节数将存储在该变量中。

另一个错误是在ReadFile的return值的测试中。您必须再次按照文档中的描述测试 ReadFile(...) != 0,而不是测试 ReadFile(...) > 0

你没有检查 WriteFile 的 return 值,我也认为这是一个错误。

根据定义,sizeof(char) == 1。使用它是惯用的。

像你一样处理二进制数据时,再次习惯使用 unsigned char

更多成语。像这样写result的赋值:

result = (GetLastError() == ERROR_HANDLE_EOF);