Linux C目录操作
宗旨:技术的学习是有限的,分享的精神是无限的。
Linux思想“一切皆文件”,目录也是文件,只是存储的内容有别于普通文件。目录文件中存储的该目录下所有的文件及子目录文件的信息,inode节点。
一、打开/关闭目录文件
1、 opendir
——打开目录
(1)函数原型
#include <dirent.h>
DIR *opendir(const char *dirname);
(2)函数参数
dirname:要打开的目录路径
(3)返回值
执行成功返回一个目录流指针(与文件流类似,直接用就行),失败返回NULL。
2、 closedir
——关闭指定的目录流
(1)函数原型
#include <dirent.h>
int *closedir(DIR *stream);
(2)函数参数
stream:目录流指针(类似于文件流指针fp一样)
(3)返回值
执行成功返回0,执行失败返回-1。
这两函数操作的对象DIR对用户层是透明,不必关心其实现细节。
【typedef struct dirstream DIR】
二、读/写目录内容
1、 readdir
——读取目录内容(目录下存储的是该目录下的文件名和对应的磁盘inode信息位置,读取目录内容就是读取该目录下的文件名及文件信息。)
(1) 函数原型
struct dirent *readdir(DIR *stream)
struct dirent
{
long d_ino; // inode值
off_t d_off; //从目录开始到当前目录条的距离
unsigned shortd_reclen; // 存储文件名的空间大小
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名,’\0’结束
};
(2)函数参数
stream:目录流指针
(3)返回值
每调用一次,返回指向下一个目录的指针,失败返回NULL。
2、 readdir_r
——读取目录内容(readdir在多线程中不安全,readdir_r解决了多线程中不安全的问题)
(1)函数原型
int readdir_r(DIR *stream, struct dirent *entry, struct dirent **result);
(2)函数参数
stream:目录流指针
entry:表示第一个参数所引用的目录流中的当前位置
result:指示的位置存储指向该结构的目录信息
(3)返回值
返回成功,在第三个参数返回一个指向描述目录条目的struct dirent类型的指针,到达目录结尾,则第三个参数中返回NULL指针,函数返回0;执行失败返回-1.
三、定位目录位置
1、 telldir
——目录流相关联的当前位置
(1)函数原型
long int telldir(DIR *stream);
(2)函数参数
stream:目录流指针
(3)返回值
成功返回一个long类型的位置值,指示目录中的当前位置,失败返回-1。
2、 seekdir
——在目录流中设置下一个readdir操作的位置
(1)函数原型
void seekdir(DIR *stream, long int loc);
(2)函数参数
stream:目录流指针
loc:从telldir()获取的目录流中的一个位置
(3)返回值
无返回值,错误将设置errno
3、 rewinddir
——将目录流的位置重置到目录的开头
(1)函数原型
void rewinddir(DIR *stream);
(2)函数参数
stream:目录流指针
(3)返回值
将stream引用的目录流的位置重置到目录的开头。
四、添加和删除目录
1、 mkdir
——创建一个目录
(1)函数原型
int mkdir(const char *path, mode_t mode);
(2)函数参数
path:欲创建的文件的路径
mode:目录的访问权限,【mode&~umask&0777】
(3)返回值
执行成功返回0,失败返回-1。
2、 rmdir
——删除目录
(1)函数原型
int rmdir(const char *path);
(2)函数参数
path:欲删除的目录文件路径
(3)返回值
执行成功返回0,失败返回-1。
五、获取当前工作路径操作
char *getcwd(char *buf, size_t size); // 将当前路径的绝对路径置于buf并返回buf,size的大小必须比返回的路径名长度大1,否则返回NULL
char *get_current_dir_name(void);// 成功返回绝对路径,失败返回NULL<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
int main(int argc, char *argv[]) /* 浏览指定文件夹下的文件 */
{
DIR *stream;
struct dirent *dp;
stream = opendir(argv[1]);
while((dp = readdir(stream)) != NULL)
{
if(dp->d_name[0] == '.')
{
continue;
}
printf("%s ", dp->d_name);
}
closedir(stream);
return 0;
}