2017-05-23 32 views
0

我正在SD/SD卡上寫入/讀取原始數據。編寫代碼的工作時間約爲4700塊,並在此限制後失敗。這裏是代碼:對於> 4700塊(SD卡原始寫入/窗口),WriteFile失敗

//Data to be written 
    uint8_t* sessions; 
    sessions = (uint8_t *) malloc(2048*sizeof(uint8_t)); 
    unsigned int i; 
    for(i=0;i<(2048*sizeof(uint8_t));i++) sessions[i]=8; 

    DWORD dwWrite; 

    HANDLE hDisk=CreateFileA("\\\\.\\K:", // drive to open = SD CARD 
      GENERIC_WRITE,    // access to the drive 
      FILE_SHARE_READ | // share mode 
      FILE_SHARE_WRITE, 
      NULL,    // default security attributes 
      OPEN_EXISTING, // disposition 
      FILE_FLAG_NO_BUFFERING,    // file attributes 
      NULL);   // do not copy file attributes 


    if(hDisk==INVALID_HANDLE_VALUE) 
    { 
     CloseHandle(hDisk); 
     printf("ERROR opening the file !!! "); 
    } 

    DWORD dwPtr = SetFilePointer(hDisk,10000*512,0,FILE_BEGIN); //4700 OK 

    if (dwPtr == INVALID_SET_FILE_POINTER) // Test for failure 
    { 
    printf("CANNOT move the file pointer !!! "); 
    } 

    //Try using this structure but same results: CAN BE IGNORED 
    OVERLAPPED osWrite  = {0,0,0}; 
    memset(&osWrite, 0, sizeof(osWrite)); 
    osWrite.Offset = 10000*512;    //4700 OK 
    osWrite.hEvent = CreateEvent(FALSE, FALSE, FALSE, FALSE); 

    if(FALSE == WriteFile(hDisk,sessions,2048,&dwWrite,&osWrite)){ 
     printf("CANNOT write data to the SD card!!! %lu",dwWrite); 
    }else{ 
     printf("Written %lu on SD card",dwWrite); 
    } 

    CloseHandle(hDisk); 

問題是與函數「Writefile」(windows.h)。如果塊號小於4700,則一切正常(數據寫入SD卡),但如果塊號爲5000或10000,則該功能將失敗「寫入0」。

注意,如果沒有FILE_FLAG_NO_BUFFERING,沒辦法打開驅動器(SD卡)。 「重疊」是一個失敗的嘗試,使其工作,不使用它(WriteFile(hDisk,會話,2048,& dwWrite,NULL))導致相同的行爲。 「SetFilePointer」也適用於高於4700的模塊。還測試了2個不同的SD卡。我在Windows 10上。

有什麼暗示發生了什麼?

謝謝您的輸入

+1

GetLastError在什麼? – RbMm

+0

你真的想寫邏輯驅動器(SD卡上的分區),而不是物理驅動器(SD卡本身)? –

回答

2

documentation for WriteFile

上的卷手柄寫會成功,如果卷沒有安裝的文件系統,或者如果滿足下列條件之一爲真:

  • 要寫入的扇區是引導扇區。

  • 要寫入的扇區位於文件系統空間之外。

  • 您已使用FSCTL_LOCK_VOLUMEFSCTL_DISMOUNT_VOLUME明確鎖定或卸除了卷。

  • 該卷沒有實際的文件系統。 (換句話說,它有一個RAW文件系統安裝。)

您可以寫信給第一對夫婦兆的,因爲(由於歷史原因)的文件系統不使用的空間。爲了寫入剩餘的音量,您首先必須使用FSCTL_LOCK_VOLUME control code鎖定音量。

+0

非常感謝。這就是它。 – Amar

0

你應該通過Null作爲SetFilePointerlpDistanceToMoveHigh的第三個參數,除非您使用的是更高階的64位地址的32位。此外,如果您沒有使用OVERLAPPED結構,請確保爲該參數傳遞NullWriteFile

此外,請確保您沒有任何數據類型溢出您正在使用。並且,請注意您正在處理的系統的尋址限制。

MSDN WriteFile
MSDN SetFilePointer

+0

在自己的代碼中運行,並將0作爲「SetFilePointer」的第三個參數。當使用'OVERLAPPED'時,'SetFilePointer'變得絕對沒有意義,並且沒有任何效果。這不解釋錯誤。在寫入失敗後需要從'GetLastError'的結果開始 – RbMm

+0

閱讀完[在空白指針中使用null或0時,C++](https://stackoverflow.com/questions/176989/do-you-use-null-or- 0-zero-for-pointers-in-c),我同意代碼的功能沒有區別。我的答案的其餘部分提示要按照問題的要求進行檢查。 –

+0

SetFilePointer:適用於我,如果第三個參數是0或NULL。 WriteFIle:是的,最後一個參數是NULL,沒有OVERLAPPED(我已經刪除了OVERLAPPED結構)。感謝您的時間 – Amar