用原始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 ++写入文件的主要内容,如果未能解决你的问题,请参考以下文章

有关文件读取写入 和两种文件打开模式的理解

用 C 读写文件

c_cpp 用C ++写入文件

C语言如何以插入方式写入文件

用C语言创建文件并写入内容

用C语言创建文件并写入内容