Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 写入文件失败,原因为>;4700块(SD卡原始写入/窗口)_C++_Windows_Winapi_Sd Card_Writefile - Fatal编程技术网

C++ 写入文件失败,原因为>;4700块(SD卡原始写入/窗口)

C++ 写入文件失败,原因为>;4700块(SD卡原始写入/窗口),c++,windows,winapi,sd-card,writefile,C++,Windows,Winapi,Sd Card,Writefile,我正在SD卡上写入/读取原始数据。写入代码最多可处理约4700个块,超过此限制后将失败。代码如下: //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;

我正在SD卡上写入/读取原始数据。写入代码最多可处理约4700个块,超过此限制后将失败。代码如下:

   //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);
//要写入的数据
uint8会议;
sessions=(uint8_t*)malloc(2048*sizeof(uint8_t));
无符号整数i;

对于(i=0;i您应该将
Null
作为
SetFilePointer
lpDistanceToMoveHigh
的第三个参数传递,除非您使用的是64位地址的高阶32位。此外,如果您没有使用
重叠
结构,请确保将该参数的
Null
传递给
WriteFile

此外,请确保您使用的数据类型没有任何溢出。并且,请注意您正在使用的系统的寻址限制



除非您使用的是64位地址的高阶32位,否则应将
Null
作为
SetFilePointer
lpDistanceToMoveHigh
的第三个参数传递。此外,如果您没有使用
重叠的
结构,请确保将该参数的
Null
传递给
WriteFile

此外,请确保您使用的数据类型没有任何溢出。并且,请注意您正在使用的系统的寻址限制


来自:

如果卷没有装入的文件系统,或者如果满足以下条件之一,则卷句柄上的写入操作将成功:

  • 要写入的扇区是引导扇区

  • 要写入的扇区位于文件系统空间之外

  • 您已使用
    FSCTL\u LOCK\u volume
    FSCTL\u DISMOUNT\u volume
    明确锁定或卸载了卷

  • 该卷没有实际的文件系统(换句话说,它装载了一个原始文件系统)

您可以写入前几兆字节,因为(出于历史原因)文件系统不使用该空间。为了写入卷的其余部分,您必须首先使用以下命令锁定卷。

如果卷没有装入的文件系统,或者如果满足以下条件之一,则卷句柄上的写入操作将成功:

  • 要写入的扇区是引导扇区

  • 要写入的扇区位于文件系统空间之外

  • 您已使用
    FSCTL\u LOCK\u volume
    FSCTL\u DISMOUNT\u volume
    明确锁定或卸载了卷

  • 该卷没有实际的文件系统(换句话说,它装载了一个原始文件系统)


您可以写入前几兆字节,因为(出于历史原因)文件系统不使用该空间。为了写入卷的其余部分,您必须首先使用。

GetLastError what at锁定卷。您真的要写入逻辑驱动器(SD卡上的分区)而不是物理驱动器吗(SD卡本身)?GetLastError在什么位置?是否确实要写入逻辑驱动器(SD卡上的分区)而不是物理驱动器(SD卡本身)?在自己的代码中进行运算,并将0作为
SetFilePointer
的第三个参数传递。此外,当使用
重叠时,
SetFilePointer
变得完全无意义且没有任何效果。这并不能解释错误。需要从写入失败后的
GetLastError
结果开始读取后,我同意函数没有任何差异代码的可选性。我的其余答案是根据问题要求检查的提示。SetFilePointer:如果第三个参数为0或NULL,则对我有效。WriteFIle:是,最后一个参数为NULL,没有重叠(我已删除重叠结构)。感谢您在自己的代码中使用timeop,并将0作为
SetFilePointer
的第三个参数传递。另外,当使用
重叠时,
SetFilePointer
变得绝对无意义且没有任何效果。这并不能解释错误。需要从写入失败后的
GetLastError
结果开始阅读后,我同意没有错误代码功能上的差异。我的回答的其余部分是根据问题的要求检查的提示。SetFilePointer:如果第三个参数为0或NULL,则对我有效。WriteFIle:是,最后一个参数为NULL,没有重叠(我已删除重叠结构)谢谢你的时间非常感谢你成功了非常感谢成功了。