目录IO

目录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:目录流指针


返回值:无。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值