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;
}