C++程序员必会的知识
目录操作函数
- int mkdir(const char *pathname,mode_t mode); //创建一个目录
#include <stdio.h> #include <sys/stat.h> #include <sys/types.h> #include <fcntl.h> int main(){ int res = mkdir("mkdirDemo",0777); if(res == -1){ perror("mkdir"); return 0; } printf("mkdir sucessful\n"); return 0; }
参数: pathname-->目录的路径(名称)
mode-->表示目录的权限,八进制数(实际权限mode & umask & 0777)
返回值:成功返回0,失败返回-1
注:umask称为掩码,通常是用来显示某些权限,防止误操作,umask操作系统规定已经规定好了。
- int rmdir(const char *pathname) ;//只能删除一个空目录
参数: pathname-->目录的路径(名称)
返回值:成功返回0,失败返回-1
#include <unistd.h> #include <stdio.h> int main(){ int res = rmdir("mkdirDemo"); if(res == -1){ perror("rmdir"); return 0; } printf("rmdir sucessful\n"); return 0; }
- int rename(const char * oldpath,const char *newpath); //重命名
参数: oldpath-->旧文件名 newpath--->新文件名
返回值:成功返回0,失败返回-1
#include <stdio.h> int main(){ int res = rename("mkdirDemo", "newmkdir"); if(res == -1){ perror("rename"); return 0; } printf("rename sucessful\n"); return 0; }
- int chdir(cosnt char*path) //修改当前进程的工作目录,这个经常用到(eg:创建守护进程)
参数: path-->目录名
返回值:成功返回0,失败返回-1
#include <unistd.h> #include <stdio.h> int main(void){ int res = chdir("/home/chen"); if(res == -1){ perror("chdir"); return 0; } printf("chdir sucessful\n"); return 0; }
- char *getcwd(char *buf,size_t size); //获取当前进程的工作目录
参数:buf-->传出参数,保存当前的工作目录 size-->buf的大小
注:我们在写API时,通常都是提供一个首地址和长度
返回值:成功 返回指向的一块内存,其实就是指向buf
失败返回NULL
#include <unistd.h> #include <stdio.h> #include <string.h> int main(){ char buf[1024] = {0}; if(getcwd(buf,sizeof(buf))==NULL){ perror("getcwd"); return 0; }else{ printf("%s\n",buf); } chdir("/home/chen"); memset(buf,0,sizeof(buf)); if(getcwd(buf,sizeof(buf))==NULL){ perror("getcwd"); return 0; }else{ printf("%s\n",buf); } return 0; }
目录的遍历函数
- DIR * opendir(const char *name); //打开目录
- struct dirent *readdir(DIR *dirp); //读目录
- int closedir(DIR *dirp); //关闭目录
DIR:一个目录结构指针,类似于FILE结构指针。保存着一些目录的信息。
dirent:是一个结构体
struct dirent{
ino_t d_ino; //此目录的进入节点
ff_t d_off; //目录文件开头至此目录进入点的位移
signed short int d_reclen; //d_name的长度
unsigned char d_type; //d_name所指向的文件类型
char d_name[256]; //文件名,256
}
t_type:指向的很多宏定义,代表不同类型的文件
DT_BLK 块文件 DT_CHR 字符设备 DT_DIR 目录 DT_LNK 软链接 DT_FIFO 管道 DT_REG 普通文件 DT_SOCK 套接字 DT_UNKONW 未知
目录函数小实践(递归获取文件的个数)
#include <stdio.h> #include <sys/types.h> #include <dirent.h> #include <stdlib.h> #include <dirent.h> #include <string.h> int getFileCount(const char *root){ //打开一个目录,得到DIR* DIR *dir = opendir(root); if(dir == NULL){ perror("opendir"); exit(0); } struct dirent* resRead = NULL; char buf[1024] = {0}; int total = 0; while ((resRead = readdir(dir)) != NULL)//打开一个目录中会有很多条记录的 { //过滤掉 . .. 避免死循环 if(strcmp(resRead->d_name,".")==0 || strcmp(resRead->d_name,"..")==0){ continue; } if(resRead->d_type == DT_DIR){//是子目录 sprintf(buf,"%s/%s",root,resRead->d_name); total += getFileCount("buf"); }else if(resRead->d_type == DT_REG){//普通文件 total++; }else{ continue; } } //关闭目录 int res = closedir(dir); if(res == -1){ perror("closedir"); exit(-1); } return total; } int main(int argc,char *argv[]){ //判断终端输入参数 if(argc < 2){ printf("%s dirname\n",argv[0]); exit(0); } //读取目录-->因为目录里面可能还要子目录,像一颗树,所以我们可以用递归 int total = getFileCount(argv[1]); printf("%s has %d file\n",argv[1],total); return 0; }