目录的创建和删除
mkdir函数
#include <sys/stat.h>
#include <sys/types.h>
int mkdir(const char *pathname, mode_t mode);
mkdir创建一个新的空目录。空目录中会自动创建.和..目录项。所创建的目录的存取许可权由mode (mode &~umask)指定。
新创建目录的uid(所有者)与创建该目录的进程的uid一致。如果父目录设置了st_gid位,则新创建的目录也设置st _gid位(目录被设置该位后,任何用户在此目录下创建的文件的组id与该目录的组id相同)。
函数执行成功返回0,当有错误发生时则返回-1,错误代码存入errno中
rmdir函数
#include <unistd.h>
int rmdir(const char *pathname);
//注意:rmdir只能删除由参数pathname指定的空目录。
函数执行成功返回0,当有错误发生时则返回-1,错误代码存入errno中
获取当前目录
命令行里用pwd里得到,程序里呢
getcwd函数
#include<unistd.h>
char *getcwd (char *buf, size_t size);
char *get_current_dir_name(void);
char *getwd (char *buf);
getcwd会将当前的工作目录绝对路径复制到参数buf所指的内存空间,参数size为buf的空间大小。在调用此函数时, buf所指的内存空间要足够大,若工作目录绝对路径的字符串长度超过参数size大小,则返回值为NULL,errno的值为ERANGE。倘若参数buf为NULL,getcwd()会根据参数 size的大小自动分配内存(使用malloc()),如果参数 size也为0,则getcwd会根据工作目录绝对路径的字符串长度来决定配置的内存大小。进程可以在使用完此字符串后利用free()来释放此空间。
执行成功则将结果复制到参数 buf 所指的内存空间,或是返回自动配置的字符串指针。失败返回NULL,错误代码存于errno。
如果定义了_GNU_ SOURCE,则也可以使用函数get_current_dir_name获取当前工作目录。该函数使用malloc分配空间来保存工作目录的绝对路径字符串,如果设置了环境变量 PWD,则返回PWD的值。
使用示例:
char *current_dir = get_current_dir_name();if (current_dir != NULL) {printf("Current working directory: %s\n", current_dir);free(current_dir); // 释放动态分配的缓冲区} else {perror("get_current_dir_name");return 1;}
如果定义了_BSD_SOURCE 或_XOPEN_SOURCE_EXTENDED,也可以使用getwd获取当前工作目录。该函数不使用malloc分配任何空间,参数 buf指向的空间的大小至少为PATH_MAX,getwd仅返回工作目录绝对路径字符串的前PATH_MAX个字符。
设置工作目录
chdir函数
#include <unistd.h>
int chdir(const char *path);
int fchdir(int fd):
chdir用来将当前工作目录改为由参数path指定的目录,fchdir用来将当前工作目录改为由参数fd(文件描述符)指定的目录。
示例程序1
利用chdir编写cd命令
#include<cstring>
#include <cstdio>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
#include<linux/limits.h>
using namespace std;
//自定义错误处理函数
void my_err(const char *err_string,int line){fprintf(stderr,"line:%d ",line);perror(err_string);exit(1);
}int main(int argc,char **argv){char buf[PATH_MAX+1];if(argc<2){printf("my_cd<target path>\n");exit(1);}if(chdir(argv[1])<0)//切换目录失败my_err("chdir",__LINE__);if(getcwd(buf,512)==nullptr)//获得当前目录信息失败my_err("getcwd",__LINE__);printf("%s\n",buf);return 0;
}
程序使用chdir系统调用将当前工作目录改变为命令行参数所指定的目录,然后用getcwd获取新的工作目录并打印出来
运行结果:
从结果看到,本程序运行后不能如cd一样进行目录切换,因为chdir只影响调用该函数的进程。
顺便了解
<linux/limits.h>
是 Linux 操作系统中的一个头文件,它定义了一些与系统相关的路径和文件名的常量,以及其他一些系统限制。具体而言,
<linux/limits.h>
包含了一些宏定义,用于表示文件和路径名的最大长度、路径分隔符等等。一些常见的宏包括:
PATH_MAX
:表示路径名的最大长度,包括终止的空字符。在大多数系统上,其值为4096字节。
NAME_MAX
:表示文件名的最大长度。这个值可以因文件系统而异。
buf的长度就是由这个头文件定义的宏而来
获取目录信息
只要对目录具有读权限,就可以获取目录信息。
opendir函数
#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *name);
opendir用来打开参数name指定的目录,并返回DIR*形态的目录流,类似于文件操作中的文件描述符,接下来对目录的读取和搜索都要使用此返回值。成功则返回DIR*型态的目录流,失败则返回NULL,错误代码存入errno中,详细的错误代码说明请参考man手册。
readdir函数
#include<sys/types.h>
#include <dirent.h>
struct dirent *readdir(DIR *dir);
readdir用来从参数dir所指向的目录中读取出目录项信息,返回一个struct dirent结构的指针
#include <sys/types.h>struct dirent {ino_t d_ino; // 文件的 inode 号off_t d_off; // 目录项在目录文件中的偏移unsigned short d_reclen; // 目录项的长度unsigned char d_type; // 文件类型(DT_REG、DT_DIR 等)char d_name[]; // 文件或目录的名称
};
函数执行成功返回该目录下一个文件的信息(存储于dirent结构体中),如果调用opendir打开某个目录之后,第一次调用该函数,则返回的是该目录下第一个文件的信息,第二次调用该函数返回该目录下第二个文件的信息,依此类推。如果该目录下已经没有文件信息可供读取,则返回NULL。调用该函数时如果有错误发生或读取到目录文件尾,则返回NULL,错误代码存入 errno。
closedir函数
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dir);
成功错误同上
示例程序2
#include<cstring>
#include <cstdio>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<unistd.h>
#include<cerrno>
#include<dirent.h>
using namespace std;
int my_readdir(const char *path){DIR *dir;struct dirent *ptr;if((dir=opendir(path))==nullptr){perror("opendir");return -1;}while((ptr=readdir(dir))!=nullptr){//读取整个目录的目录项printf("file name :%s\n",ptr->d_name);//输出它们的名称}closedir(dir);return 0;
}
int main(int argc,char **argv){if(argc<2){printf("listfile<target path>\n");exit(1);}if(my_readdir(argv[1])<0)exit(1);return 0;
}
运行结果: