C语言目录操作

 

        目录的操作不论是在嵌入式产品还是应用软件编程都是必不可少的,不同的开发语言可能略有不同,本章节主要是讨论在Linux平台下对目录的一系列操作,以我的个人经验,创建目录和列出目录中的文件这两个功能用得最多。

获取当前目录

        在系统命令行下我们可以直接输入命令pwd 来获取当前的工作目录,但是你知道这个命令是怎么执行的吗?它是由系统通过 shell 程序来解释执行的,我们也可以自己编写程序调用getcwd函数获取当前的工作目录。

       函数声明:

              char * getcwd(char * buf,size_t size);

        getcwd函数把当前目录的名字写到给定的缓冲区buf里。如果目录的名字超出了参数size给出的缓冲区长度(一个ERANGE错误),它就返回NULL。如果成功,它返回指针buf,我们可以访问buf来获取当前的目录。

例如:

                char strpwd[301];

                memset(strpwd,0,sizeof(strpwd))

                getcwd(strpwd,300);

                printf("当前目录是:%s\n",strpwd);

切换目录

       函数声明:

              int chdir(const char *path);

       就像我们在shell里使用cd命令来切换目录一样,在程序里则可以使用chdir系统调用来实现目录的变更。 

       返回值:0-切换成功;非0-失败。

目录的创建和删除

        在系统命令行下我们可以通过mkdir和rmdir命令通过shell来创建一个目录和删除一个目录,如果在程序中呢,总不可能由程序员自己去手动创建吧,一般都是程序自动创建一个目录来存放文件。

       创建目录函数的声明:

              int mkdir(const char *pathname, mode_t mode);

       mode的含义将按open系统调用的O_CREAT选项中的有关定义设置,当然,它还要服从umask的设置况。是不是看不明白?那先固定填00755,注意,00不要省略哦。     

        例如:

              mkdir("/tmp/aaa",00755);   // 创建/tmp/aaa目录

       删除目录函数的声明:

              int rmdir(const char *pathname);

获取目录中的文件列表

       获取目录中的文件列表,类似于ls命令。

       在实际开发中,我们经常要处理文件,文件是存放在目录中的,在处理文件之前,必须先知道目录中有哪些文件,所以要获取目录中的文件列表。涉及到的库函数如下:

1、包含头文件

       #include <dirent.h>

2、库函数

       打开目录的函数opendir的声明。

              DIR *opendir(const char *pathname);

       读取目录的函数readdir的声明。

              struct dirent *readdir(DIR *dirp);

       关闭目录的函数closedir的声明。

              int closedir(DIR *dirp);

3、数据结构

       DIR是目录指针,就像文件操作时的文件指针。

       调用一次readdir,返回结构体struct dirent(在dirent.h中声明,程序员只管用就行了)的指针,存放本次读取到的文件的信息,就像文件操作时调用一次fgets一样,但是fgets调用获取的内容是一个字符串,readdir返回的是结构体。

              struct dirent

              {

                        long d_ino;                    // inode number 索引节点号

                        off_t d_off;                    // offset to this dirent 在目录文件中的偏移

                        unsigned short d_reclen;       // length of this d_name 文件名长

                        unsigned char d_type;          // the type of d_name 文件类型

                        char d_name [NAME_MAX+1];  // file name文件名,最长255字符

              };

       我们只需要关注结构体的d_type和d_name成员,其它的不必关心。

       d_name文件名或目录名。

       d_type描述了文件的类型,有多种取值,最重要的是8和4,8-常规文件(A regular file);4-目录(A directory),其它的暂时不关心。

       示例(book123.cpp)

       

应用经验

       在实际开发中,对目录的操作并不会像book123.c那样简单。

       实际需就是这样的,文件存放在某目录中,该目录下还会有多级子目录,程序员想要的是列出该目录及其子目录下全部的文件名。

       例如存在/oracle/tmp目录,子目录结构和文件如下:

       

       示例(book124.c)

       

      程序比较长,主程序的说明文字和预处理部分我没有复制进来。

       运行结果

       

      这才是程序员想要的结果。

      在某些C语言的教材里,有递归函数这个概念,在我的教程里,没有讲这个概念,实际上,book124.c的ReadDir函数就是一个递归函数,在ReadDir函数中调用了自身。

版权声明

C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。

来源:C语言技术网(www.freecplus.net

作者:码农有道

如果这篇文章对您有帮助,请点赞支持,或在您的博客中转发我的文章,谢谢!!!

如果文章有错别字,或者内容有误,或其他的建议或意见,请您留言指正,非常感谢!!!

 

  • 13
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C语言技术网-码农有道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值