下一个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;
}
}
答案 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);