Linux C高级编程——目录操作

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;
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值