目录
一、获取当前工作目录
在 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);
- 就像我们在 linux 中使用 cd 命令切换目录一样,在C程序中使用 chdir 函数来改变工作目录。
- 返回值: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;
}
运行效果