2017-05-23 30 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