Open directory using C

I am accepting the path through command line input.

When I do

dir=opendir(args[1]);

it doesn' t enter the loop...i.e dir==null...

How do I pass the command line input to dir pointer?

void main(int c,char **args)
{
    DIR *dir;
    struct dirent *dent;
    char buffer[50];
    strcpy(buffer, args[1]);
    dir = opendir(buffer);   //this part
    if(dir!=NULL)
    {
        while((dent=readdir(dir))!=NULL)
            printf(dent->d_name);
    }
    close(dir);
}

./a.out  /root/TEST is used to run the program..
./a.out --> to execute the program
/root/TEST --> input by the user i.e valid path
14
задан rollstuhlfahrer 4 April 2018 в 20:38
поделиться

3 ответа

Вам действительно стоит опубликовать свой код, но начнем. Начните с:

    #include <stdio.h>
    #include <dirent.h>

    int main (int c, char *v[]) {
        struct dirent *pDirent;
        DIR *pDir;

        if (c < 2) {
            printf ("Usage: testprog <dirname>\n");
            return 1;
        }
        pDir = opendir (v[1]);
        if (pDir == NULL) {
            printf ("Cannot open directory '%s'\n", v[1]);
            return 1;
        }

        while ((pDirent = readdir(pDir)) != NULL) {
            printf ("[%s]\n", pDirent->d_name);
        }
        closedir (pDir);
        return 0;
    }

В вашем случае вам нужно проверить, что args [1] задано и относится к фактическому каталогу. Когда это запускается с:

testprog tmp

( tmp - это подкаталог вне моего текущего каталога, но вы можете использовать любой допустимый каталог), я получаю:

[.]
[..]
[file1.txt]
[file1_file1.txt]
[file2.avi]
[file2_file2.avi]
[file3.b.txt]
[file3_file3.b.txt]

Обратите внимание, что вы должны передать каталог , а не файл . Когда я выполняю:

testprog tmp/file1.txt

, я получаю:

Cannot open directory 'tmp/file1.txt'

, потому что это файл, а не каталог (если вы коварны, вы можете попытаться использовать diropen (dirname (v [1])) , если исходный diropen не работает).

39
ответ дан 1 December 2019 в 06:43
поделиться

Некоторые отзывы о сегменте кода, хотя по большей части он должен работать...

void main(int c,char **args)
  • int main - стандарт определяет main как возвращает int.
  • c и args обычно называются argc и argv, со всем уважением, но вы можете называть их как угодно

...

{
DIR *dir;
struct dirent *dent;
char buffer[50];
strcpy(buffer,args[1]);
  • У вас здесь переполнение буфера: если args[1] длиннее 50 байт, буфер не сможет его удержать, и вы запишете в память, что вы не должен. Я не вижу причин копировать буфер сюда, поэтому вы можете обойти эти проблемы, просто не используя strcpy...

...

dir=opendir(buffer);   //this part

If this return NULL ], это может быть по нескольким причинам:

  • Каталог не существует. (Правильно ли вы его ввели? В нем был пробел, и вы набрали ./your_program мой каталог, что не удастся, потому что он пытается opendir("my") )
  • У вас нет прав доступа к каталогу
  • Недостаточно памяти. (Это маловероятно.)
2
ответ дан 1 December 2019 в 06:43
поделиться

Параметры, передаваемые исполняемому файлу программы C, представляют собой не что иное, как массив строк (или указателей на символы), поэтому память уже была выделена для этих входных параметров до того, как ваша программа получит доступ к этим параметрам, поэтому нет необходимости выделять буфер, и это таким образом, вы также можете избежать кода обработки ошибок в своей программе (уменьшить вероятность segfault :)).

2
ответ дан 1 December 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: