Linux之管理目录
一、目录以及基础知识
在 linux 中,文件目录包含文件名列表,每一个文件名对应一个 inode 编号。
目录中还能包含其它子目录,在 linux 中所有的目录和文件都是以树形结构组织的。
既然是树形结构,那么肯定就有一个根,在 linux 下有一个根 root 目录,使用命令“cd /”就可以进入 root 目录。
注意:root 目录指的是根目录。另外有一个 root 用户的概念,一个是目录中的概念,一个是 linux用户中的概念,不要混淆。
在接下来的小节中会学习到当前工作目录,创建目录,删除目录,读取目录内容等。
二、getcwd 函数
1、使用 man 学习 getcwd 函数
如下图所示,使用命令“man 3 getcwd”。有三个类似的函数 getcwd,getwd,get_current_dir_name。
接着介绍一下 getcwd 和 get_current_dir_name 的用法。
注意:getwd函数已经过时,使用的时候会有警告。
char *getcwd(char *buf, size_t size);
//参数*buf:保存当前目录的缓冲区。
//参数 size:在现代 linux 中,buf 的长度至少可以为 255 字节。
//返回值:成功返回指向当前目录的指针,和 buf 的值一样,错误返回 NULL。
char *get_current_dir_name(void);
//参数:无
//返回值:成功返回指向当前目录的指针,错误返回 NULL。
关于get_current_dir_name函数,给大家再介绍一点额外的知识。
打开头文件“/usr/include/unistd.h”,找到函数定义。如下图所示。
如上图所示,必须定义“__USE_GNU”才能使用get_current_dir_name 函数。另外经过测试发现,getwd 函数,无论定义不定义条件,都会警告这个函数已经过时,虽然可以使用。
2、函数例程
编写简单的 getcwd.c 文件测试 getcwd 函数。
#include <stdio.h>
/*getcwd、getwd和get_current_dir_name
函数的头文件*/
#define __USE_GNU
#include <unistd.h>
#define LENTH 255
int main()
{
char pwd[LENTH];
char *wd;
//getcwd函数测试
if(!getcwd(pwd,LENTH)){
perror("getcwd");
return 1;
}
printf("\ngetcwd pwd is %s\n",pwd);
//getwd函数测试
wd = getwd(pwd);
if(!wd){
perror("getcwd");
return 1;
}
printf("\ngetwd pwd is %s\n",wd);
//get_current_dir_name函数测试
wd = get_current_dir_name();
if(!wd){
perror("getcwd");
return 1;
}
printf("\nget_current pwd is %s\n",wd);
return 0;
}
3、运行结果
如上图所示,由于作者运行程序的当前目录是 linux 的“/”,所示显示是“/”。大家可以在其它目录下运行,看一下效果。
三、mkdir 函数
1、 使用 man 学习 mkdir 函数
如下图所示,使用命令“man 2 mkdir”,并回车。
接着介绍一下 mkdir 的用法。
int mkdir(const char *pathname, mode_t mode);
//参数:文件路径
//参数 mode:直接使用数字即可。和前面命令中 chmod 777 xxx 中的 777 这个参数含义类似,也可以使用文档中的组合值。
//返回值:成功返回 0,错误返回-1
2、函数例程
编写简单的 mkdir.c 文件测试 mkdir 函数。
#include <stdio.h>
//mkdir函数头文件
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc,char *argv[])
{
int ret;
//检测参数
if(argc <2){
printf("\nPlease input file path\n");
return 1;
}
//使用mkdir函数新建目录
ret = mkdir(argv[1],0777);
if(ret<0){
printf("mkdir %s failed!\n",argv[1]);
return 1;
}
printf("mkdir %s suceces!\n",argv[1]);
return 0;
}
3、运行结果
如上图所示,接着使用 ls 命令查看,可以发现新建了一个 test 目录。
四、rmdir 函数
1、使用 man 学习 rmdir 函数
如下图所示,使用命令“man 2 rmdir”。
接着介绍一下 rmdir 的用法。
int rmdir(const char *pathname);
//参数*pathname:文件和目录的路径。
//返回值:成功返回 0,错误返回-1。
2、函数例程
编写简单的 rmdir.c 文件测试 rmdir 函数。
#include <stdio.h>
//rmdir函数头文件
#include <unistd.h>
int main(int argc,char *argv[])
{
int ret;
//检测参数
if(argc <2){
printf("\nPlease input file path\n");
return 1;
}
//使用rmdir函数删除目录
ret = rmdir(argv[1]);
if(ret<0){
printf("rmdir %s failed!\n",argv[1]);
return 1;
}
printf("rmdir %s suceces!\n",argv[1]);
return 0;
}
3、运行结果
如上图所示,删除的是前面一个实验 mkdir 程序新建的 test 目录,如果再次使用 ls 命令查看,将会发现这个 test 目录被删除了。
五、chdir 函数
本节实验介绍如何使用代码改变当前工作目录。
在实际应用中,代码可能需要从当前目录中进到其它目录,这个时候首先需要使用 getcwd函数获取当前目录,保存起来,然后使用 chdir 跳到其它目录,完成操作,然后再使用 chdir回到最初保存的目录。
1、使用 man 学习 chdir 函数
如下图所示,使用命令“man 2 chdir”。有两个类似的函数 chdir,fchdir。
接着介绍一下 chdir 和 fchdir 的用法。
int chdir(const char *path);
//参数 *path:文件路径
//返回值:成功返回 0,错误返回-1。
int fchdir(int fd);
//参数 fd:open 函数返回的句柄,文件描述符。
//返回值:成功返回 0,错误返回-1。
2、函数例程
编写简单的 chdir.c 文件测试 chdir 函数。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
//chdir和fchdir函数头文件
#include <unistd.h>
#define LENTH 255
int main(int argc,char *argv[])
{
int ret;
char pwd[LENTH];
//检测参数
if(argc <3){
printf("\nPlease input file path\n");
return 1;
}
//getcwd函数获取当前目录
if(!getcwd(pwd,LENTH)){
perror("getcwd");
return 1;
}
printf("\ngetcwd pwd is %s\n",pwd);
//使用chdir函数转入其他目录
ret = chdir(argv[1]);
if(ret){
printf("Please make sure file path\n");
return 1;
}
printf("chdir %s is success!\n",argv[1]);
//转入其他目录,完成操作
//使用rmdir函数删除目录
ret = rmdir(argv[2]);
if(ret<0){
printf("rmdir %s failed!\n",argv[2]);
return 1;
}
printf("rmdir %s is success!\n",argv[2]);
//再次使用chdir回到pwd保存的目录
ret = chdir(pwd);
if(ret){
printf("Please make sure file path\n");
return 1;
}
printf("chdir %s is success!\n",pwd);
return 0;
}
3、运行结果
运行程序前,使用使用命令“mkdir /mnt/test”在/mnt 目录下新建一个 test 目录,如下图所示,“/mnt”目录将作为一个参数传递给 chdir 程序,另一个参数“/mnt/test”也会传递过去,这个“/mnt/test”目录将会被删除。
运行程序如下图所示。
如上图所示,程序运行之后,再次使用 ls 命令查看,会发现“mnt”目录下的“test”已经被删除了。
六、opendir 和 closedir 函数
1、使用 man 学习 opendir 和 closedir 函数
如下图所示,使用命令“man 3 opendir”。有两个类似的函数 opendir 和 fdopendir,fdopendir 不是标准的函数,不建议使用,移植性不太好,这里也直接使用 opendir。
接着介绍一下 opendir、closedir 的用法。
DIR *opendir(const char *name);
//参数:目录的路径。
//返回值:成功返回指向目录流的指针,错误返回 NULL。
int closedir(DIR *dirp);
//参数:opendir 返回的 dir 指针。
//返回值:成功返回 0, 失败返回-1.
2、函数例程
编写简单的 opendir.c 文件测试 opendir 和 closedir 函数。
#include <stdio.h>
//opendir和closedir函数头文件
#include <dirent.h>
#include <sys/types.h>
int main(int argc,char *argv[])
{
int ret;
DIR *dir;
//检测参数
if(argc <2){
printf("\nPlease input file path\n");
return 1;
}
//使用opendir函数打开目录
dir = opendir(argv[1]);
if(dir==NULL){
printf("opendir %s failed!\n",argv[1]);
return 1;
}
printf("opendir %s suceces!\n",argv[1]);
//使用closedir函数关闭目录
closedir(dir);
return 0;
}
3、运行结果
如上图所示,可以看到在程序中打开了目录“mnt”。
七、readdir 函数
1、使用 man 学习 readdir 函数
如下图所示,使用命令“man 3 readdir”。有 readdir 和 readdir_r 两个函数,这里只介绍 readdir。
看一下参数的结构体 dirent,如下图所示。
如上图所示,各个参数的解释还是很清楚明了的。
struct dirent *readdir(DIR *dirp);
//参数 dirp:opendir 函数打开目录后返回的文件指针。
//返回值:成功返回指向 dirp 的指针 dirent ,错误返回 NULL。
2、函数例程
编写简单的 readdir.c 文件测试 readdir 函数。
#include <stdio.h>
//opendir,closedir,readdir函数头文件
#include <dirent.h>
#include <sys/types.h>
int main(int argc,char *argv[])
{
int ret;
DIR *dir;
struct dirent *catlog;
//检测参数
if(argc <2){
printf("\nPlease input file path\n");
return 1;
}
//使用opendir函数打开目录
dir = opendir(argv[1]);
if(dir==NULL){
printf("opendir %s failed!\n",argv[1]);
return 1;
}
printf("opendir %s suceces!\n",argv[1]);
//使用readdir读取目录argv[1]
catlog = readdir(dir);
if(catlog == NULL){
printf("readdir %s failed!\n",argv[1]);
return 1;
}
printf("%s d_ino is %ld\n ",argv[1],catlog->d_ino);
//使用closedir函数关闭目录
closedir(dir);
return 0;
}
3、运行结果
如上图所示,这里只是读取了文件许多参数中的 d_ino,其它参数可以自己写小程序打印出来。