C语言目录操作
目录的操作不论是在嵌入式还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,本章节主要是讨论在Linux系统下目录的一系列操作,以我的个人经验,创建目录和列出目录中的文件这两个功能用得最多。
一、获取当前工作目录
在shell中我们可以直接输入命令pwd来显示当前的工作目录,在C程序中调用getcwd函数可以获取当前的工作目录。函数声明:
1 | char * getcwd(char * buf,size_t size); |
getcwd函数把当前工作目录存入buf中,如果目录名超出了参数size长度,函数返回NULL,如果成功,返回buf。例如:
1 | char strpwd[301]; |
二、切换工作目录
函数声明:
1 | int chdir(const char *path); |
就像我们在shell中使用cd命令切换目录一样,在C程序中使用chdir函数来改变工作目录。
返回值:0-切换成功;非0-失败。
三、目录的创建和删除
在shell中可以通过mkdir/rmdir命令来创建/删除目录,C程序中用mkdir/rmdir函数来创建/删除目录。
创建目录函数的声明:
1 | int mkdir(const char *pathname, mode_t mode); |
mode的含义将按open系统调用的O_CREAT选项中的有关定义设置,当然,它还要服从umask的设置况,是不是看不明白?那先固定填0755,注意,0不要省略哦,它表示八进制。 例如:
1 | mkdir("/tmp/aaa",0755); // 创建/tmp/aaa目录 |
删除目录函数的声明:
1 | int rmdir(const char *pathname); |
四、获取目录中的文件列表
在实际开发中,文件是存放在目录中的,在处理文件之前,必须先知道目录中有哪些文件,所以要获取目录中的文件列表。涉及到的库函数如下:
1、包含头文件
1 |
2、相关的库函数
打开目录的函数opendir的声明:
1 | DIR *opendir(const char *pathname); |
读取目录的函数readdir的声明:
1 | struct dirent *readdir(DIR *dirp); |
关闭目录的函数closedir的声明:
1 | int closedir(DIR *dirp); |
3、数据结构
1)目录指针DIR
1 | DIR *目录指针名; |
2)struct dirent结构体
每调用一次readdir函数会返回一个struct dirent的地址,存放了本次读取到的内容,它的原理与fgets函数读取文件相同。
1 | struct dirent |
我们只需要关注结构体的d_type和d_name成员,其它的不必关心。
d_name文件名或目录名。
d_type描述了文件的类型,有多种取值,最重要的是8和4,8-常规文件(A regular file);4-目录(A directory),其它的暂时不关心。
4、读取目录
示例(book123.cpp)
1 | /* |
运行效果
五、应用经验
在实际开发中,对目录的操作并不会像book123.c那样简单。
实际需求是这样的,文件存放在某目录中,该目录下还会有多级子目录,程序员想要的是列出该目录及其子目录下全部的文件名。
例如存在/home/wucz/tmp目录,其子目录结构和文件如下:
示例(book124.c)
1 | /* |
运行效果
这才是程序员想要的结果。
在某些C语言的教材里,有递归函数这个概念,在我的教程里,没有讲这个概念,实际上,book124.c的ReadDir函数就是一个递归函数,在ReadDir函数中调用了自身。
六、课后作业
编写示例程序,把本章节介绍的知识点全部演示一遍,用程序演示可以加深您的理解和映象。
七、版权声明
C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
来源:C语言技术网(www.freecplus.net)
作者:码农有道