C++ 写入文件失败,原因为>;4700块(SD卡原始写入/窗口)
我正在SD卡上写入/读取原始数据。写入代码最多可处理约4700个块,超过此限制后将失败。代码如下: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;
//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,没有重叠(我已删除重叠结构)谢谢你的时间非常感谢你成功了非常感谢成功了。