Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对于execv()如何在没有父文件和根文件的情况下进行tar压缩_C_Archive_Execv - Fatal编程技术网

对于execv()如何在没有父文件和根文件的情况下进行tar压缩

对于execv()如何在没有父文件和根文件的情况下进行tar压缩,c,archive,execv,C,Archive,Execv,这个问题在这个网站上被问了一百万次,有各种不同的解决方案,但似乎没有一种适合我的情况 到目前为止,最有希望的是tar-cvf testest.tar-C folder1*,其中folder1包括: Folder1 >txt1.txt >folder2 >txt2.txt 在终端中运行上述代码将创建testtest.tar,其中包括一系列错误消息: txt1.txt folder2 >txt2.txt 但是,当通过execv在函数

这个问题在这个网站上被问了一百万次,有各种不同的解决方案,但似乎没有一种适合我的情况

到目前为止,最有希望的是
tar-cvf testest.tar-C folder1*
,其中folder1包括:

Folder1
    >txt1.txt
    >folder2
        >txt2.txt
在终端中运行上述代码将创建
testtest.tar
,其中包括一系列错误消息:

txt1.txt
folder2
    >txt2.txt
但是,当通过execv在函数中运行时,如下所示:

pid_t archive = fork();
    switch(archive)
    {
        case -1 :
        {
            printf("fork() failed\n");
            break;
        }
        case 0 :
        {
            if( strcmp(getFileExtension(finalArchiveName), "tar") == 0)
            {
                char* args[] = {"/usr/bin/tar","-cvf", finalArchiveName, "-C", "dest", "*", NULL};
                int error = execv("/usr/bin/tar", args);    
                if(error == -1){
                    perror("Error when archiving");
                    exit(EXIT_FAILURE);
                }
                else{
                    exit(EXIT_SUCCESS);
                }
                break;
            }
//... (not including the whole function, only the part i feel is relevant to the question)
它返回时带有
/usr/bin/tar::://无法统计:没有这样的文件或目录


另一行我已经厌倦了,就是用
替换
*
,但是最终包括根目录shell用文件名列表替换
*
,您可以通过在shell中键入
echo*
看到。但是对
execv
的调用中没有shell,除非您专门执行shell:

char* args[] = {"sh", "-c", "tar /usr/bin/tar -cvf testetest.tar -C dest *", NULL};
int error = execv("/bin/sh", args);
在这种情况下,
system()
通常是更简单的选择


如果要创建文件名列表作为参数传递给命令行实用程序,请查看。

我也想使用
system()
,但为了这个项目,禁止使用
system()
。我将看一看
glob()
,但我想这并不是一个简单的方法。@papsheng:glob很容易使用,如果允许的话。它甚至允许您在它返回的数组的开头保留一些空插槽,您可以在后面用
*
前面的argv条目填充这些插槽我如何
execv()
这个?如果这能奏效的话,我想现在就修补一下,做一个临时的修复。@Papsheng:我打给execv的电话更明确了。我省略了使用
snprintf
(或
asprintf
如果可用)将tar文件名插入命令参数的部分。这为我提供了一些如何解决此问题的想法,谢谢