C++ C++;将文件复制到USB设备

C++ C++;将文件复制到USB设备,c++,usb,createfile,C++,Usb,Createfile,我有几种不同类型的文件.gz.cfg.tar我想将它们复制到连接到驱动器的USB设备上。这是我的代码: //path -> destination path looking like: "\\\\?\\"+ driveLetter + ":\\file" //i -> my Iterator for Map<srcPath,destPath> QFile qsrcFile(i.key()); QFileInfo srcInfo(qsrcFile); QSt

我有几种不同类型的文件
.gz
.cfg
.tar
我想将它们复制到连接到驱动器的USB设备上。这是我的代码:

//path -> destination path looking like: "\\\\?\\"+ driveLetter + ":\\file"
//i -> my Iterator for Map<srcPath,destPath>
QFile qsrcFile(i.key());
    QFileInfo srcInfo(qsrcFile);
    QString path(i.value());
    HANDLE usbHandle = CreateFileW(path.toStdWString().c_str(),
                                GENERIC_WRITE, //can cause permission problems > set to 0
                                FILE_SHARE_WRITE,
                                0,
                                CREATE_ALWAYS,
                                FILE_ATTRIBUTE_NORMAL,
                                0);

    if(usbHandle == INVALID_HANDLE_VALUE){
        DWORD err = ::GetLastError();
        fprintf(stderr,"Error INVALID_HANDLE_VALUE \n \t Path: %s \n \t Error: %d \n",path.toStdString().c_str(),err);
        if(err == ERROR_PATH_NOT_FOUND){
            CreateDirectoryW(path.toStdWString().substr(0,path.lastIndexOf("\\")).c_str(),0);
            i.previous(); //try creating a file again, 
                          //this time with a parent directory (works only for depth = 1)
        }
        continue;
    }

    DWORD written = 0;

    if(!WriteFile(usbHandle, qsrcFile.readAll(), srcInfo.size(), &written, NULL)){
        qsrcFile.close();
        fprintf(stderr,"Error at WriteFile() \n \t file: %s \n",qsrcFile.fileName().toStdString().c_str()); //writting error
        continue;
    }
//路径->目标路径看起来像:“\\\?\\”+driveLetter+“:\\file”
//i->Map的迭代器
QFile qsrcFile(i.key());
QFileInfo srcInfo(qsrcFile);
QString路径(i.value());
HANDLE usbHandle=CreateFileW(path.toStdWString().c_str(),
泛型写入,//可能导致权限问题>设置为0
文件共享写入,
0,
永远创造你,
文件\u属性\u正常,
0);
if(usbHandle==无效的句柄值){
DWORD err=::GetLastError();
fprintf(stderr,“错误无效\u句柄\u值\n\t路径:%s\n\t错误:%d\n”,路径.toStdString().c\u str(),err);
if(err==错误路径未找到){
CreateDirectoryW(path.toStdWString().substr(0,path.lastIndexOf(“\\”)).c_str(),0);
i、 previous();//再次尝试创建文件,
//这一次使用父目录(仅适用于深度=1)
}
继续;
}
DWORD WRITED=0;
if(!WriteFile(usbHandle,qsrcFile.readAll(),srcInfo.size(),&writed,NULL)){
qsrcFile.close();
fprintf(stderr,“WriteFile()错误\n\t文件:%s\n”,qsrcFile.fileName().toStdString().c_str());//写入错误
继续;
}
如果我运行该程序,似乎usbHandler无效。我不确定如何正确使用这些WinAPI函数,但我认为这可以工作。 我只需要将文件写入
I:/(USB)

如何将文件复制到连接到驱动器的USB设备

编辑

  • 修复
    \\\\.\\I:\\
    以获取
    \\.\I:\
    工作正常。(也可以用“?”代替圆点)
  • 我出现错误:
    错误\u访问被拒绝
    因此我尝试更改
    dwDesiredAccess
    标记为0(我还尝试以管理员身份运行VS2010)。它现在已经修好了,但这会导致其他问题
  • 有一次我(magicly)得到了一些文件,但是
    .tar
    .gz
    文件坏了/空了。当
    WriteFile()
    太原始时,如何写入此文件

Sidenote:如果写入错误,将在返回之前关闭文件。第三个项目符号与此无关。这些函数太原始,无法了解文件类型。由于您正在传递
wchar\u t
,因此确实应该使用
CreateFileW
。<代码> CREATFEFILE < /C>宏扩展到 CuraFiele或 CreateFileW < /C> >,但与C++重载不同,这并不考虑参数类型。将
wchar\u t*
传递给
CreateFileA
将给出您描述的症状。有道理,但不幸的是它没有解决问题。为什么
OPEN\u EXISTING
?旁注:如果出现写入错误,将在返回之前关闭文件。第三个项目符号与此无关。这些函数太原始,无法了解文件类型。由于您正在传递
wchar\u t
,因此确实应该使用
CreateFileW
。<代码> CREATFEFILE < /C>宏扩展到 CuraFiele
CreateFileW < /C> >,但与C++重载不同,这并不考虑参数类型。将
wchar\u t*
传递到
CreateFileA
将给出您描述的症状。这是有道理的,但不幸的是它没有解决问题。为什么
打开现有的