目录IO中有哪些接口?
1)如何打开一个目录呢? -> opendir() -> man 3 opendir
功能: open a directory
//打开一个目录
头文件:
#include <sys/types.h>
#include <dirent.h> -> 目录专属头文件
原型:
DIR *opendir(const char *name);
参数:
name:需要打开的那个目录的路径。 (绝对路径/相对路径)
返回值:
成功:目录流指针。
失败:NULL。
1)、什么是目录流指针?
打开一个目录,会返回一个指针,该指针默认指向目录中的第一项。
2)、问题一: 使用opendir来打开一个目录,就等价于切换到该目录下吗? -> 不是
3)、问题二: 要是目录下没有文件,那指向NULL吗? -> 不为NULL。
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{
system("pwd");
DIR *dp = opendir("./ggy_dir");
if(dp == NULL)
printf("opendir error!\n");
system("pwd");
return 0;
}
2)如何切换到目录下? -> chdir() -> man 2 chdir
(这里所说的切换,只是在程序中切换,ubuntu里面的路径不会变。)
功能:change working directory
头文件:
#include <unistd.h>
原型:
int chdir(const char *path);
参数:
path:你想切换到那个目标的路径。
返回值:
成功:0
失败:-1
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
system("pwd");
DIR *dp = opendir("./ggy_dir");
if(dp == NULL)
printf("opendir error!\n");
system("pwd");
int ret;
ret = chdir("./ggy_dir");
if(ret == -1)
printf("chdir error!\n");
system("pwd");
return 0;
}
结果:
gec@ubuntu:/mnt/hgfs/GZ2057/06 文件IO/06/code$ ./dir
/mnt/hgfs/GZ2057/06 文件IO/06/code
/mnt/hgfs/GZ2057/06 文件IO/06/code
/mnt/hgfs/GZ2057/06 文件IO/06/code/ggy_dir
注意:切换到一个目录下的好处是什么。
如果不切换:
fopen("./ggy_dir/ggy.txt");
如果切换:
fopen("./ggy.txt");
3)如何读取目录下的内容? -> readdir() -> man 3 readdir
功能:read a directory
头文件:
#include <dirent.h>
原型:
struct dirent *readdir(DIR *dirp);
参数:
dirp:目录流指针
返回值:
成功:结构体指针 struct dirent *
失败:NULL
struct dirent {
ino_t d_ino; //索引号
off_t d_off; //偏移量
unsigned short d_reclen; //该项的长度
unsigned char d_type; //文件类型
char d_name[256]; //文件名
};
d_type:
enum
{
DT_UNKNOWN = 0, -> 未知类型
DT_FIFO = 1, -> 管道文件
DT_CHR = 2, -> 字符设备文件
DT_DIR = 4, -> 目录文件
DT_BLK = 6, -> 块设备文件
DT_REG = 8, -> 普通文件
DT_LNK = 10, -> 链接文件
DT_SOCK = 12, -> 套接字文件
};
例题: 打开ggy_dir,并将里面的每一个目录项的类型与文件名读取出来。
#include <sys/types.h>
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
DIR *dp = opendir("./ggy_dir");
if(dp == NULL)
printf("opendir error!\n");
int ret;
ret = chdir("./ggy_dir");
if(ret == -1)
printf("chdir error!\n");
struct dirent *ep = NULL;
while(1)
{
ep = readdir(dp);
if(ep == NULL)
{
break;
}
if(ep->d_name[0] == '.')
{
continue;
}
printf("type = %d\n",ep->d_type);
printf("name = %s\n",ep->d_name);
printf("==========================\n");
}
return 0;
}
4)关闭目录。 -> closedir() -> man 3 closedir
功能: close a directory
头文件:
#include <sys/types.h>
#include <dirent.h>
原型:
int closedir(DIR *dirp);
参数:
dirp:目录流指针
返回值:
成功:0
失败:-1
5)重置目录流指针。 -> rewinddir() -> man 3 rewinddir
功能: reset directory stream
//重置目录指针
头文件:
#include <sys/types.h>
#include <dirent.h>
原型:
void rewinddir(DIR *dirp);
参数:
dirp:目录流指针
返回值:无。