我正在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);
问题在于&#34; Writefile&#34; (WINDOWS.H)。如果块的数量小于4700.一切都很好(数据写在SD卡上),但如果块号是5000或10000,则函数失败&#34;写0&#34;
请注意,如果没有FILE_FLAG_NO_BUFFERING,则无法打开驱动器(SD卡)。 &#34; OVERLAPPED&#34;是一个失败的尝试,使其工作,而不是使用它(WriteFile(hDisk,sessions,2048,&amp; dwWrite,NULL))导致相同的行为。 &#34; SetFilePointer&#34;适用于高于4700的块。还测试了2种不同的SD卡。我在Windows 10上。
有关正在发生的事情的任何提示?
感谢您的输入
答案 0 :(得分:2)
来自documentation for WriteFile:
如果卷没有已安装的文件系统,或者满足下列条件之一,则卷句柄上的写入将成功:
要写入的扇区是引导扇区。
要写入的扇区驻留在文件系统空间之外。
您已使用
FSCTL_LOCK_VOLUME
或FSCTL_DISMOUNT_VOLUME
明确锁定或停止了该卷。卷没有实际的文件系统。 (换句话说,它安装了RAW文件系统。)
您可以写入前几兆字节,因为(由于历史原因)文件系统不使用该空间。要写入卷的其余部分,您首先必须使用FSCTL_LOCK_VOLUME
control code锁定卷。
答案 1 :(得分:0)
除非使用64位地址的高位32位,否则应将Null
作为SetFilePointer
,lpDistanceToMoveHigh
的第3个参数传递。另外,如果您未使用OVERLAPPED
结构,请务必将Null
传递给WriteFile
以获取该参数。
此外,请确保您使用的数据类型没有任何溢出。并且,请注意您正在处理的系统的寻址限制。