Linux系统函数之文件系统管理(三)
对于目录的操作
opendir函数
作用:打开一个目录
头文件:
include <sys/types.h> #include <dirent.h>
函数原型:
DIR *opendir(const char *name)
返回值:成功返回一个指向DIR结构体的指针 ,失败返回NULL
参数:目录名
附录:类f似于对于C语言对文件的操作 DIR* 相当于 FILE*
DIR结构体详解
struct __dirstream
{
void *__fd;
char *__data;
int __entry_data;
char *__ptr;
int __entry_ptr;
size_t __allocation;
size_t __size;
__libc_lock_define (, __lock)
};
typedef struct __dirstream DIR;
DIR结构体类似FILE,是一个内部结构,以下几个函数用这个内部结构保存当前正在被读取的目录的相关信息。
1. struct dirent *readdir(DIR* *dp)
读取目录
2.void rewinddir(DIR* dp)
用来设置参数dir目录流目前的读取位置为原来开头的读取位置
3. int closedir(DIR* dp)
关闭目录
4. long telldir(DIR* dp)
用于记录着一个目录流的位置。返回值记录着一个目录流的当前位置。此返回值代表距离目录文件开头的偏移量返回值返回下个读取位置
-
void seekdir(DIR* dp, long loc)
设置参数dir目录流当前的读取位置,在调用readdir()时便从此新位置开始读取。参数offset 代表距离目录文件开头的偏移量。
readdir函数
作用:读取目录
头文件:
#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dirp)
返回值:成功返回一个指向
struct dirent
结构体类型的指针,失败返回NULL
;
参数:
opendir
函数返回的目录流指针
struct dirent
结构体详解
目录文件:存储了一张表,该表就是该目录文件下,所有文件名和inode的映射关系。 这种文件包含了其他文件的名字以及指向这些文件有关的信息的指针
所以,dirent
不仅仅指向目录,还指向目录中的具体文件。
struct dirent
{
ino_t d_ino; /* inode number */ 索引节点号
off_t d_off; /* not an offset; see NOTES */ 在目录文件中的偏移量
unsigned short d_reclen; /* length of this record */ 文件名长度
unsigned char d_type; /* type of file; not supported
by all file system types */ 文件类型
char d_name[256]; /* filename */ 文件名
};
closedir函数
作用:关闭目录
头文件:
#include <dirent.h>
函数原型:
struct dirent *readdir(DIR *dirp)
返回值:成功返回一个指向
struct dirent
结构体类型的指针,失败返回NULL
;
参数:
opendir
函数返回的目录流指针
getcwd函数
功能:获取当前工作目录
头文件:
#include <unistd.h>
函数原型:
char *getcwd(char *buffer, size_t size)
返回值:成功则返回当前工作目录,失败返回 NULL
参数说明:getcwd()会将当前工作目录的绝对路径复制到参数buffer所指的内存空间中,参数size为buffer的空间大小。
chdir函数
功能:改变工作目录
头文件:
#include <unistd.h>
函数原型:
int chdir(const char *path)
返回值:成功则返回当前工作目录,失败返回 NULL
参数说明:Path 目标目录,可以是绝对目录或相对目录
参考代码:
#include <stdio.h>
#include <errno.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char** argv)
{
DIR* dp = opendir(argv[1]); //打开目录
char dirname[101];
if(NULL == dp)
{
perror("opendir");
return -1;
}
struct dirent* dir = NULL;
getcwd(dirname,sizeof(dirname)); //获得当前目录
printf("%s\n",dirname);
chdir(argv[2]); //切换工作目录
getcwd(dirname,sizeof(dirname));
printf("%s\n",dirname);
while(dir = readdir(dp)) //遍历目录
{
printf("%s\n", dir->d_name);
}
closedir(dp);
return 0;
}