ReadFile / WriteFile崩溃

时间:2015-02-11 13:44:12

标签: winapi

下一个ReadFile / WriteFile代码有问题。 我需要使用这个函数来使用复制文件(是的,它最好使用CopyFile,但现在我需要它),但它在读/写循环时崩溃了。 什么可能是错的?

  

PS C:\ Users \ user \ Documents \ SysLab1 \ dist \ Debug \ MinGW-Windows> g ++ --version   g ++。exe(x86_64-posix-sjlj-rev0,由MinGW-W64项目构建)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;
    }
}

1 个答案:

答案 0 :(得分:3)

来自WriteFile的{​​{3}}:

  

<强> lpNumberOfBytesWritten

     

仅当lpOverlapped参数不为NULL时,此参数才为NULL。

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

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

您不会检查WriteFile的返回值,我也认为这是一个错误。

根据定义,sizeof(char) == 1。利用它是不恰当的。

当您处理二进制数据时,再次使用unsigned char是惯用的。

更多成语。像这样写result的作业:

result = (GetLastError() == ERROR_HANDLE_EOF);