从 QProcess 启动 7zip 会出现错误 "cannot find archive"

Starting 7zip from QProcess gives error "cannot find archive"

我正在开发一个使用 Qt5 制作的应用程序,它将 .zip 文件下载到临时目录并将 .zip 文件解压缩到指定目录。

我已经设法下载了 .zip 文件,现在我正在尝试使用 7zip 将其解压缩。我使用 QProcess 来启动 7Zip。

这里是我的 Qt-build-kit-thingy 的文件结构:

build-ExtractTest-Desktop_Qt_5_3_MSVC2013_64bit-Debug
    7za.exe
    build
        ExtractTest.exe

这是我用来启动流程的代码:

// assemble extraction command
QString extractProgram = "7za.exe";
QStringList extractArguments;
extractArguments << "x"; // extract files and directories
extractArguments << "-y"; // suppress questions
extractArguments << "-o\"" + installPath+"\""; // extract to installdir
extractArguments << "\""+currentPath +"\"";

std::cout << extractProgram.toStdString() << " " << extractArguments.join(" ").toStdString() << std::endl;

// start extraction
extractionProcess.start(extractProgram, extractArguments);

这是我的程序的输出(我将 7zip 的所有输出打印到标准输出):

7za.exe x -y -o"D:\Projects\build-ExtractTest-Desktop_Qt_5_3_MSVC2013_OpenGL_32bit-Debug\BlaBla" "C:/Users/js/AppData/Local/Temp/eci2002win.zip"
started

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18


Error:
cannot find archive


0

然而,当我从控制台执行命令时,7zip 会按预期工作:

D:\Projects\build-ExtractTest-Desktop_Qt_5_3_MSVC2013_64bit-Debug>7za.exe x -y -o"D:\Projects\build-ExtractTest-Desktop_Qt_5_3_MSVC2013_OpenGL_32bit-Debug\BlaBla" "C:/Users/js/AppData/Local/Temp/eci2002win.zip"

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18

Processing archive: C:\Users\js\AppData\Local\Temp\eci2002win.zip

Extracting  ECI-Target VisualLayout.csv
Extracting  DataSet CrossReference.xls
Extracting  ECI2002 RandomLayoutCmyk1485-LZW.tif
Extracting  ECI2002 VisualLayoutCmyk1485-LZW.tif
Extracting  ECI-Target RandomLayout.csv
Extracting  ColorTargetRecommendation.pdf
Extracting  SampleDataSet Sorted by ID.txt
Extracting  SampleDataSet Sorted by Loc.txt

Everything is Ok

Files: 8
Size:       1978871
Compressed: 504660

所以我猜测是在通过QProcess 执行7zip 时存在路径问题。我可能是错的。有人有什么想法吗?

PS:我从这里下载了这个随机 zip 文件:http://www.eci.org/_media/downloads/eci_2002_target/eci2002win.zip

编辑:我尝试将 QDir::toNativeSeparators() 放在路径周围以转换为 Windows' 路径分隔符:

extractArguments << "-o\"" + QDir::toNativeSeparators(installPath) + "\""; // extract to installdir
extractArguments << "\"" + QDir::toNativeSeparators(currentPath) + "\"";

这也不行。这是我的应用程序的新控制台输出:

7za.exe x -y -o"D:\Projects\ExtractTest\build-Verpacker2-Desktop_Qt_5_3_MSVC2013_OpenGL_32bit-Debug\BlaBla" "C:\Users\JanS\AppData\Local\Temp\eci2002win.zip"
started

7-Zip (A) 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18


Error:
cannot find archive

既然卡米尔没有回答,我自己给:

7zip 的正确调用方式是

7za.exe x -y "-oD:\Projects\ExtractTest\build-Verpacker2-Desktop_Qt_5_3_MSVC2013_OpenGL_32bit-Debug\BlaBla" "C:\Users\JanS\AppData\Local\Temp\eci2002win.zip"

7zip 不喜欢 -o 之后的 "