对于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文件名插入命令参数的部分。这为我提供了一些如何解决此问题的想法,谢谢