используя команду 'rm' в программе на c, используя функцию system () в stdlib.h - PullRequest
3 голосов
/ 12 февраля 2010

Я пытаюсь использовать команду rm в основной подпрограмме для удаления файла, который у меня есть в командной строке Значение сохраняется в argv[2] Я пытался использовать

system("rm argv[2]");

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

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

Но это дает мне ошибку, говоря

"cannot locate file argv[2]"

Имя файла хранится в argv[2], как я его проверил.

Кто-нибудь, пожалуйста, ведите меня!

Ответы [ 9 ]

15 голосов
/ 12 февраля 2010

Почему бы не использовать команду remove или unlink вместо system("rm ...")?

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


Обновите , если необходимо использовать system("rm ...")

Если необходимо использовать system("rm ..."), ZelluX правильно указывать, что вы должны получить имя файла из argv[2].Вы можете получить строку в argv[2], используя snprintf или strncpy .Использование вариантов функций, ограничивающих размер ввода, является хорошей идеей , поскольку нет никакой гарантии относительно длины строки в argv[2].

В зависимости от вашего приложения выможет также потребоваться вызвать stat , чтобы убедиться, что строка в argv[2] действительно является файлом, и, возможно, ограничить тип файла.

Пример:

В этом примере вызывается 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);
    }
}
8 голосов
/ 12 февраля 2010

«argv [2]» в «rm ./argv[2]» является литеральной строкой, если вы хотите использовать то, что хранится в argv [2], вам нужно использовать strcpy () или sprintf () связать «rm ./» со строкой, хранящейся в argv [2].

2 голосов
/ 12 февраля 2010

См. Также unlink (2) (определено в unistd.h), если вы хотите удалить файлы без вызова system ().

2 голосов
/ 12 февраля 2010

вместо вызова системной команды 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;

}
2 голосов
/ 12 февраля 2010

argv [2] содержит строку и сама не является строкой. Пожалуйста, используйте strcpy или другой механизм манипуляции со строками, чтобы получить строку из argv [2] в буфер, а затем создать команду, используя rm, и затем передать ее системе. Это должно работать.

1 голос
/ 26 июля 2010

Использование system как это (на самом деле, используя его вообще) является формулой катастрофы. Предположим, что argv[2] содержит "-rf /". : -)

1 голос
/ 12 февраля 2010

Вам нужно сначала создать строку. Просто положить argv [2] в кавычки не получится.

Пример:

char buf[256];

buf[255] = '\0';
if (snprintf(buf, 255, "rm %s", argv[2]) != -1) {
    system(buf);
}
0 голосов
/ 13 августа 2013

На самом деле argv[2] - это строка, и вы используете ее в качестве имени файла, чтобы использовать ее в качестве строки, которую нужно объединить. По этой причине вы не можете найти файл с именем argv[2] вместо имени файла в массиве символов argv[2]. Попробуйте разные методы объединения.

0 голосов
/ 12 февраля 2010

проблема в том, что argv [2] не раскрывается и передается просто так, поскольку нет файла с именем argv [2], возникнет ошибка. Решением было бы создать строку с помощью sprintf () и затем передать ее в system ()

char str[100];
sprintf(str,"rm %s",argv[2]);
system(str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...