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;
}
}
来自WriteFile
的documentation:
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);
下一个 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;
}
}
来自WriteFile
的documentation:
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);