Открыть каталог с помощью C

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

Когда я делаю

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

Ответ 1

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

    #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 завершится неудачей).

Ответ 2

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

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"))
  • Вам не хватает разрешений для каталога
  • Недостаточно памяти. (Это маловероятно.)

Ответ 3

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

Ответ 4

Вот простой способ реализовать команду 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);
     }