C语言目录操作详解

目录

一、获取当前工作目录

举个例子 

运行效果

二、切换工作目录

三、目录的创建和删除

举个例子 

运行效果

四、获取目录中的文件列表

包含头文件

相关的库函数

数据结构

举个例子

运行效果

五、读取目录

 运行效果


一、获取当前工作目录

linux 中我们可以直接输入命令 pwd 来显示当前的工作目录

 

在C程序中调用 getcwd 函数可以获取当前的工作目录

函数声明: 

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

 getcwd函数把当前工作目录存入buf中,如果目录名超出了参数size长度,函数返回NULL,如果成功,返回buf

举个例子 

#include <stdio.h>
#include <string.h>

int main()
{

    char pwd[301];
    memset(pwd,0,sizeof(pwd));
    getcwd(pwd,300);
    printf("当前目录是:%s\n",pwd);

    return 0;
}

运行效果

二、切换工作目录

函数声明:

int chdir(const char *path);
  1. 就像我们在 linux 中使用 cd 命令切换目录一样,在C程序中使用 chdir 函数来改变工作目录。
  2. 返回值:0-切换成功;非0-失败

三、目录的创建和删除

 在 linux 中可以通过 mkdir/rmdir 命令来创建/删除目录,C程序中用 mkdir/rmdir 函数来创建/删除目录

创建目录函数的声明:

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

例如:

  mkdir("/root/cyy1/aaa",0755);   // 创建/tmp/aaa目录

参数 mode 里面填 0755 是什么意思呢?

其实是linux的一些基础知识 

我们看如下图片

  • 权限的数字表示 :
  • r ------ 4  读权限,可以查看文件,可以列出目录中的内容
  • w  ---- 2  写权限,可以修改文件,可以在目录中创建/删除文件
  • x  -----1  执行权限,可以执行文件,可以进入目录
  • 所以 -rwx r-x r-x 用数字表示就是 755,0表示八进制,所以填0755

删除目录函数的声明:

int rmdir(const char *pathname);

举个例子 

#include <stdio.h>
#include <string.h>

int main()
{

    mkdir("/root/cyy1/aaa",0755);
    mkdir("/root/cyy1/bbb",0755);
    mkdir("/root/cyy1/ccc",0755);

    return 0;
}

运行效果

 

 drwx r-x r-x,d表示这是一个目录

四、获取目录中的文件列表

文件是存放在目录中的,在处理文件之前,必须先知道目录中有哪些文件,所以要获取目录中的文件列表

包含头文件

#include <dirent.h>

相关的库函数

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

DIR *opendir(const char *pathname);

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

struct dirent *readdir(DIR *dirp);

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

int closedir(DIR *dirp);

数据结构

目录指针 DIR

DIR *目录指针名;

struct dirent 结构体

每调用一次 readdir 函数会返回一个struct dirent的地址,存放了本次读取到的内容,它的原理与fgets函数读取文件相同

struct dirent
{
   long d_ino;                    // 索引节点号
   off_t d_off;                   // 在目录文件中的偏移
   unsigned short d_reclen;     //  文件名长
   unsigned char d_type;         // 文件类型
   char d_name [NAME_MAX+1];    //  文件名,最长255字符
};
  • 只需要关注结构体的 d_type d_name 成员,其它的了解一下即可
  • d_name文件名或目录名
  • d_type描述了文件的类型,有多种取值,最重要的是8和4,
  • 8-常规文件
  • 4-目录

举个例子

#include <stdio.h>
#include <dirent.h>

int main(int argc,char* argv[])
{

    if (argc != 2)
    {   
        printf("请指定目录名.\n");
        return -1;
    }

    // 定义目录指针
    DIR *dir;

    // 打开目录
    if (  (dir = opendir(argv[1])) ==0 )
    return -1;

    // 用于存放从目录中读取到的文件和目录信息
    struct dirent *stdinfo;

    while (1)
    {
       // 读取一条记录并显示到屏幕
       if ( (stdinfo=readdir(dir)) ==0 )
       break;
       printf("name=%s,type=%d\n",stdinfo->d_name,stdinfo->d_type);
    }

    closedir(dir);//关闭目录指针

    return 0;
}

运行效果

五、读取目录

文件存放在某目录中,该目录下还会有多级子目录

列出该目录及其子目录下全部的文件名

#include <stdio.h>
#include <dirent.h>

// 列出目录及子目录下的文件
int ReadDir(const char *strpathname)
{
    DIR *dir;   // 定义目录指针
    char strchdpath[256];  // 子目录的全路径

    // 打开目录
    if ( (dir=opendir(strpathname)) ==0 )
    return -1;

    struct dirent *stdinfo; // 用于存放从目录读取到的文件和目录信息
    while (1) {

     // 读取一行记录
     if ( (stdinfo=readdir(dir))==0 )
     break;

     // 以.开始的文件不读 .表示的是隐藏文件
     if ( (strncmp(stdinfo->d_name,".",1)) ==0 )
     continue;

      // 如果是文件,显示出来
     if (stdinfo->d_type==8)
     {
        printf("name=%s/%s\n",strpathname,stdinfo->d_name);
     }
     // 如果是目录,再调用一次ReadDir
     if (stdinfo->d_type==4)
     {
         sprintf(strchdpath,"%s/%s",strpathname,stdinfo->d_name);
         ReadDir(strchdpath);
     }
   }
   closedir(dir);
}

int main(int argc,char* argv[])
{

    if (argc != 2)
    {
        printf("请指定目录名.\n");
        return -1;
    }

    // 列出目录及子目录下的文件
    ReadDir(argv[1]);

    return 0;
}

 运行效果

猜你喜欢

转载自blog.csdn.net/XiaoQiu__/article/details/127394908
今日推荐