この質問は、このサイトでさまざまな解決策を使って何百万回も質問されていますが、私の場合はどれもうまくいかないようです。
これまでのところ、最も有望なのはtar -cvf testetest.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: *: Cannot stat: No such file or directory
私は疲れてきたもう一つのラインは交換することである*
と.
、ルートディレクトリを含めて最大しかし、その両端
シェルに*
入力するとわかるようecho *
に、シェルはをファイル名のリストに置き換えます。ただしexecv
、特にシェルを実行しない限り、の呼び出しにはシェルはありません。
char* args[] = {"sh", "-c", "tar /usr/bin/tar -cvf testetest.tar -C dest *", NULL};
int error = execv("/bin/sh", args);
このような場合、system()
多くの場合、より簡単な代替手段です。
コマンドラインユーティリティに引数として渡すファイル名のリストを作成する場合は、を参照してくださいglob()
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加