我正在尝试在主例程中使用rm
命令来删除我已经使用命令行参数的文件。该值存储在我尝试过使用
argv[2]
中
system("rm argv[2]");
system("rm ./argv[2]");
system("rm $HOME/argv[2]");
但它给我一个错误说
"cannot locate file argv[2]"
文件名存储在argv[2]
中,因为我已经检查了它。
有人请指导我!
答案 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]
中。尝试不同的连接方法。