2015-02-11 37 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);