С ++ unzip возвращает не может создать каталог для извлечения

Я написал простой фрагмент кода для извлечения zip-файлов с помощью unzip. Он отлично работает, когда выходной каталог не установлен, но возвращает ошибку, если каталог установлен

«Архив: /home/vishvesh.kumar/tempFolder/test.zip checkdir: невозможно создать каталог для извлечения: /home/vishvesh.kumar/tempFolder Нет такого файла или каталога»

Код:

int main(int argc, char *argv1[])
{
    std::cout << "Creating child process...";
    std::vector<std::string> arguements;

    char* argv[4] = {0};
    argv [0] = "/usr/bin/unzip";
    argv [2] = "/home/vishvesh.kumar/tempFolder/test.zip";
    argv [1] = "-d /home/vishvesh.kumar/tempFolder/";
    argv [3] = NULL;
   createChildProcess(argv);

}


void createChildProcess(char* argv[])
{
    pid_t pid = fork();
    if (pid == -1)
    {
            std::cout << "error creating child process, exiting...";
            exit(1);
    }
    else if (pid == 0)
    { // This is the child process
       std::cout << "This is the child process. About to sleep\n";
       std::cout << "Woke up\n";
       if (execvp(argv[0], argv))
        { // execvp failed
            std::cout << "fatal - execvp failed!";
            exit(1);
        }

     }
    else
    { // This is the parent process.
        std::cout << "This is the parent process\n";
        int status;
        std::cout << " done. PID: " << pid << ".\n";

        double start = 0;
        waitpid(pid, &status, 0); // Wait for program to finish executing.
        double dur = (clock() - start) / CLOCKS_PER_SEC; // Get execution time
        std::cout << "Sad my son died\n";
        std::cout << "Program returned " << WEXITSTATUS(status);
        std::cout << " and lasted " << dur << " seconds.\nPress enter.\n";
        std::cin.get();
    }
}

person Vishvesh    schedule 08.02.2013    source источник


Ответы (2)


char* argv[4] = {0};
argv [0] = "/usr/bin/unzip";
argv [2] = "/home/vishvesh.kumar/tempFolder/test.zip";
argv [1] = "-d /home/vishvesh.kumar/tempFolder/";
argv [3] = NULL;

Должно быть:

char* argv[5];
argv [0] = "/usr/bin/unzip";
argv [1] = "-d";
argv [2] = "/home/vishvesh.kumar/tempFolder/";
argv [3] = "/home/vishvesh.kumar/tempFolder/test.zip";
argv [4] = NULL;

В вашем понимании параметр -d - это zip-файл, поскольку это параметр после -d. Таким образом, он пытается создать этот каталог и не может, потому что это файл.

person David Schwartz    schedule 08.02.2013

argv [1] = "-d /home/vishvesh.kumar/tempFolder/";

должно быть

argv [1] = "-d";
argv [2] = "/home/vishvesh.kumar/tempFolder/";

Это два отдельных параметра, передаваемых новому процессу через execvp().

person Wernsey    schedule 08.02.2013
comment
Я попробовал, но ничего не вышло. Получил следующую ошибку. Внимание: имя файла не совпадает: /home/vishvesh.kumar/tempFolder/ - person Vishvesh; 08.02.2013