LINUX系统API---操作目录

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@陈一言

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值