使用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 ie valid path 

你应该真的发布你的代码,但这里去了。 从…开始:

  #include  #include  int main (int c, char *v[]) { int len; struct dirent *pDirent; DIR *pDir; if (c < 2) { printf ("Usage: testprog \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失败)。

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

关于代码段的一些反馈,尽管在大多数情况下,它应该工作…

 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")
  • 您缺少该目录的权限
  • 内存不足。 (这不太可能。)

这是使用c实现ls命令的简单方法。 运行使用例如./xls /tmp

  #include #include  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); }