使用stdlib.h中的system()函数在c程序中使用'rm'命令

时间:2010-02-12 06:54:03

标签: c unix

我正在尝试在主例程中使用rm命令来删除我已经使用命令行参数的文件。该值存储在我尝试过使用

argv[2]
system("rm argv[2]");

system("rm ./argv[2]");

system("rm $HOME/argv[2]");

但它给我一个错误说

"cannot locate file argv[2]"

文件名存储在argv[2]中,因为我已经检查了它。

有人请指导我!

9 个答案:

答案 0 :(得分:15)

为什么不使用 remove unlink 命令代替system("rm ...")

remove(argv[2]);unlink(argv[2]);


在必须使用system("rm ...")

的情况下,

更新

如果您必须使用system("rm ..."),则ZelluX表明您必须从argv[2]检索文件名是正确的。您可以使用 snprintf strncpy argv[2]中检索字符串。使用限制输入大小的函数变体是good idea,因为无法保证argv[2]中字符串的长度。

根据您的应用程序,您可能还需要调用 stat 来验证argv[2]中的字符串确实是文件,并可能限制文件类型。< / p>

示例:

此示例调用 stat 来验证argv[2]是否为常规文件, asprintf 为缓冲区动态分配空间

char *p;
struct stat st;

if (stat(argv[2], &st) == 0 && S_ISREG(st->st_mode))
{
    if (asprintf(&p, "rm %s", argv[2]) != -1)
    {
        system(p);
        free(p);
    }
}

答案 1 :(得分:8)

“rm ./argv [2]”中的“argv [2]”是一个文字字符串,如果要使用存储在argv [2]中的内容,则需要使用strcpy()或sprintf()将“rm ./”与存储在argv [2]中的字符串连接起来。

答案 2 :(得分:2)

argv [2]包含字符串,它本身不是字符串。请使用strcpy或其他字符串操作机制将argv [2]中的字符串放入缓冲区,然后使用rm构造命令,然后将其传递给系统。这应该有用。

答案 3 :(得分:2)

而不是调用system rm命令,在C中执行,例如

#include <stdio.h>
#include <dirent.h>
int  main()
{
        struct dirent *d;
        DIR *dir;
        char buf[256];
        dir = opendir("mydir");
        while(d = readdir(dir))
        {               
                sprintf(buf, "%s/%s", "mydir", d->d_name);
                remove(buf);
        }
        return 0;

}

答案 4 :(得分:2)

如果要在不调用system()的情况下删除文件,请参阅unlink(2)(在unistd.h中定义)。

答案 5 :(得分:1)

您需要先构造字符串。将argv [2]放在引号中是行不通的。

示例:

char buf[256];

buf[255] = '\0';
if (snprintf(buf, 255, "rm %s", argv[2]) != -1) {
    system(buf);
}

答案 6 :(得分:1)

答案 7 :(得分:0)

问题是argv [2]没有得到扩展并且就像那样传递,因为没有名为argv [2]的文件,会出现错误。 解决方案是使用sprintf()生成一个字符串,然后将其传递给system()

char str[100];
sprintf(str,"rm %s",argv[2]);
system(str);

答案 8 :(得分:0)

实际上argv[2]是一个字符串,您将其用作文件名,以便将其用作需要连接的字符串。这就是您无法找到名称为argv[2]的文件的原因,而是文件名在char数组argv[2]中。尝试不同的连接方法。