使用C打开目录

时间:2010-08-24 06:58:21

标签: c opendir

我接受命令行输入的路径。

当我这样做时

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 个答案:

答案 0 :(得分:40)

你应该真的发布你的代码,但是这里。从:

开始
    #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

答案 1 :(得分:2)

传递给C程序可执行文件的参数只是一个字符串(或字符指针)数组,因此在程序访问这些参数之前,已经为这些输入参数分配了内存,因此不需要分配缓冲区,你也可以避免程序中的错误处理代码(减少段错误的几率:))。

答案 2 :(得分:1)

关于代码段的一些反馈,尽管在大多数情况下,它应该有用......

void main(int c,char **args)
  • int main - 标准将main定义为返回int
  • cargs通常分别命名为argcargv,但您可以为其命名

...

{
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 :(得分:0)

以下是使用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);
     }