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