2015-02-11 63 views
-2

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

PS C:\用户\用户\文件\ SysLab1 \ DIST \调试\ MinGW的-视窗>克++ --version 克++ 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

你能更具体地了解“崩溃”吗?你有没有收到任何错误讯息?分段故障? – Chris 2015-02-11 13:54:53

回答

3

documentationWriteFile的:

lpNumberOfBytesWritten

只有当lpOverlapped参数不为NULL时,此参数才可以为NULL。

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

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

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

定义:sizeof(char) == 1。利用它是惯用的。

在处理二进制数据时,您仍然可以使用unsigned char

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

result = (GetLastError() == ERROR_HANDLE_EOF);