使用c ++提取.rar / .zip

时间:2015-03-20 07:17:35

标签: c++ windows command-line winrar

由于没有特殊原因,我目前正在开发一个使用system()提取.zip / .rar文件的程序。

我目前安装了WinRar,因为winrar.exe能够同时处理.zip& .rar文件。

int main()
{
    vector<wstring> files;

    if (ListFiles(L"folder", L"*", files))
    {
        string program = "\"C:\\Program Files\\WinRAR\\winrar.exe\"";
        string args = "x -y";
        string type = "*.*";

        TCHAR dir[MAX_PATH];
        GetCurrentDirectory(MAX_PATH, dir);
        wstring current_directory(wstring(L"\"") + dir + wstring(L"\\"));

        for (const auto& f : files)
        {
            if (wcscmp(PathFindExtension(f.c_str()), L".rar") == 0 ||
                wcscmp(PathFindExtension(f.c_str()), L".zip") == 0)
            {
                string file = ws2s(f.c_str());
                string output = "\"c:\\Users\\my name\\Desktop\\output\"";

                string command = program + " " + args + " " + ws2s(current_directory) + file + "\"" + " " + type + " " + output;
                cout << command << endl;

                if (system(command.c_str()) != 0)
                    return GetLastError();
            }
        }
    }

    return 0;
}

因为我正在使用命令行,并且不希望空格出现问题,所以我用引号将其包装起来:
      - "C:/users/username/program files (x86)/" -
      - "folder/zipped folder.zip" vs folder/"zipped folder.zip" -

在构建command中包含的完整命令后,我将其打印到屏幕上,以便我可以编辑 - &gt;标记:
"C:\Program Files\WinRAR\winrar.exe" x -y "C:\Users\my name\Documents\Visual Studio 2013\Projects\extractor\folder\unzip.zip" *.* "c:\Users\my name\Desktop\output"

然而,'C:\Program' is not recognized as an internal or external command, operable program or batch file.是我在system(command)电话后遇到的问题。

如果我复制&amp;将完全相同的命令粘贴到Start-&gt;命令提示符中,它就像梦一样。

How to extract ZIP files with WinRAR command line?
http://comptb.cects.com/using-the-winrar-command-line-tools-in-windows/
https://www.feralhosting.com/faq/view?question=36

有没有办法以不同方式调用system()来电? 如果没有,还可以使用命令行参数吗?

我宁愿[完全避免]不使用Boost ::或第三方库。

谢谢!

1 个答案:

答案 0 :(得分:1)

这可能是因为quirky behavior of Command Prompt引用了参数。无论何时拨打system("\"arg1\" \"arg2\""),都相当于致电:

cmd.exe /c "arg1" "arg2"

由于链接帖子中描述的奇怪行为,命令提示符无法正确解释。需要一组额外的引号:

cmd.exe /c ""arg1" "arg2""

对于调用可执行文件,CreateProcess提供了一种替代方法,可让您更好地控制该进程。您仍然必须引用参数,但rules are a bit simpler因为命令提示符不再适合您。