用原始usb c ++写入文件
Posted
技术标签:
【中文标题】用原始usb c ++写入文件【英文标题】:write file in raw usb c++ 【发布时间】:2015-11-04 12:30:31 【问题描述】:这是我的代码:
int main(int argc, CHAR* argv[])
using namespace std;
PVOID data[1024];
DWORD dwBytesRead = 0;
DWORD dwBytesWrite = 512;
HANDLE hFile = CreateFile(L"\\\\.\\E:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);//open usb
if (hFile == INVALID_HANDLE_VALUE)
printf("Error %x", GetLastError());
return 1;
printf ("created usb hendle\n");
LARGE_INTEGER a = 50688 ;
SetFilePointerEx(hFile, a,NULL,0); //set the pointer to c600
printf("got usb pointer set\n");
PVOID ToBe = ":) hello this is our file -> ";
if (WriteFile(hFile,ToBe,512 ,&dwBytesWrite, NULL) == 0)
printf("writeFile error: %x", GetLastError());
CloseHandle(hFile);
return 1;
printf("write the first string in isb\n");
HANDLE aFile = CreateFile(L"C:\\Users\\h7080y_dxlq\\Downloads\\Video\\88250.mp4", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0); //open the file handle
printf("created mp4 hendle\n");
if (aFile == INVALID_HANDLE_VALUE)
printf("Error %x", GetLastError());
return 1;
if (ReadFile(aFile, &data, 512, &dwBytesRead, NULL) == 0)
printf("ReadFile error: %x", GetLastError());
return 1;
DWORD dwPos;
printf("checked for read errors in mp4 passed o.k.\n");
while (ReadFile(aFile, data,512, &dwBytesRead, NULL) && dwBytesRead > 0) //read file
dwPos = SetFilePointerEx(hFile, a, NULL, 0);
LockFile(hFile, dwPos, 0, dwBytesRead, 0);
WriteFile(hFile, data, 512, &dwBytesWrite, NULL); // write 512 bit chunk at the time to usb
UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
a = 50688+512 ; // promot
printf("write all mp4 to the usb directtly\n");
ToBe = "<- this is the end of file , see you soon :)";
if (WriteFile(hFile, ToBe, 512, &dwBytesWrite, NULL) == 0)
printf("writeFile error: %x", GetLastError());
CloseHandle(hFile);
return 1;
printf("after end massage \n");
CloseHandle(hFile);
system("pause");
return 0;
我尝试获取一个文件(在这种情况下为 mp4),并逐块读取它(当时为 512 位),获取该块并将其写入 USB 等直到文件结束。
现在,问题是:
循环永远不会结束。
B它没有将文件写入USB,它看起来像是一次又一次地写在同一个地方......
我该如何解决?
【问题讨论】:
【参考方案1】:LARGE_INTEGER a = 50688 ;
while (ReadFile(aFile, data,512, &dwBytesRead, NULL) && dwBytesRead > 0)
dwPos = SetFilePointerEx(hFile, a, NULL, 0);
LockFile(hFile, dwPos, 0, dwBytesRead, 0);
WriteFile(hFile, data, 512, &dwBytesWrite, NULL);
UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
a = 50688+512 ;
第一次循环时,您将文件指针设置为50688
并在那里写入。每次循环之后,您将文件指针设置为50688+512
并在那里写入。
看起来它一次又一次地写入同一个位置。
确实如此。这正是您的代码所指定的。您应该将文件指针设置在循环外的aFile
上,并在写入文件时让它自然前进。像这样的:
dwPos = 50688;
LARGE_INTEGER a = dwPos ;
if (!SetFilePointerEx(hFile, a, NULL, 0))
// handle error
while (ReadFile(aFile, data, 512, &dwBytesRead, NULL) && dwBytesRead > 0)
LockFile(hFile, dwPos, 0, dwBytesRead, 0);
WriteFile(hFile, data, 512, &dwBytesWrite, NULL);
UnlockFile(hFile, dwPos, 0, dwBytesRead, 0);
dwPos += 512;
请注意,您对LockFile
的调用以及对dwPos
使用DWORD
意味着您不能写入大于4GB 的文件。
我还不清楚是否需要调用LockFile
。由于您的原始代码处理 dwPos
错误,很明显您没有锁定您打算锁定的文件部分。我认为您应该简单地删除它们。在这种情况下,代码将变为:
LARGE_INTEGER a = 50688 ;
if (!SetFilePointerEx(hFile, a, NULL, 0))
// handle error
while (ReadFile(aFile, data, 512, &dwBytesRead, NULL) && dwBytesRead > 0)
if (!WriteFile(hFile, data, 512, &dwBytesWrite, NULL))
// handle error
您还省略了此代码中的大量错误检查。如果发现它还有许多其他问题,我不会感到惊讶。我并不是特别想尝试找出您代码中的每一个错误,希望我所写的内容足以帮助您。
【讨论】:
谢谢。我使用 lockFile 是因为它的 writefile 在 readfile 循环中并且编译器不允许以常规方式执行它,只有当我使用 lockFile 时它才会抛出 我完全无法理解 我认为对LockFile
的调用是对WriteFile API 的误解:“如果卷没有安装文件系统,则对卷句柄的写入将成功,或者如果以下条件之一为真:[...] 您已使用 FSCTL_LOCK_VOLUME 或 FSCTL_DISMOUNT_VOLUME 明确锁定或卸载卷。"以上是关于用原始usb c ++写入文件的主要内容,如果未能解决你的问题,请参考以下文章