Открыть каталог с помощью C - PullRequest
14 голосов
/ 24 августа 2010

Я принимаю путь через ввод командной строки.

Когда я делаю

dir=opendir(args[1]);

это не входит в цикл ... т.е. dir==null ...

Как передать ввод командной строки в указатель dir?

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

Ответы [ 4 ]

40 голосов
/ 24 августа 2010

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

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

    int main (int c, char *v[]) {
        int len;
        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 не пройден).

2 голосов
/ 24 августа 2010

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

1 голос
/ 24 августа 2010

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

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 байт, buffer не сможет его удержать, и вы запишете в память то, что не должны. Я не вижу причин для копирования здесь буфера, поэтому вы можете обойти эти проблемы, просто не используя strcpy ...

...

dir=opendir(buffer);   //this part

Если это возвращает NULL, это может быть по нескольким причинам:

  • Каталог не существует. (Правильно ли вы ввели его? Было ли в нем пробел, и вы ввели ./your_program my directory, что не удастся, поскольку он пытается opendir("my"))
  • У вас нет прав доступа к каталогу
  • Недостаточно памяти. (Это маловероятно.)
0 голосов
/ 25 июля 2016

Вот простой способ реализовать команду ls, используя c.Для запуска используйте, например, ./xls /tmp

    #include<stdio.h>
    #include <dirent.h>
    void main(int argc,char *argv[])
    {
   DIR *dir;
   struct dirent *dent;
   dir = opendir(argv[1]);   

   if(dir!=NULL)
      {
   while((dent=readdir(dir))!=NULL)
                    {
        if((strcmp(dent->d_name,".")==0 || strcmp(dent->d_name,"..")==0 || (*dent->d_name) == '.' ))
            {
            }
       else
              {
        printf(dent->d_name);
        printf("\n");
              }
                    }
       }
       close(dir);
     }
...