LINUX系统API---操作目录

简介: 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;
}
相关文章
|
1天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
14 5
linux系统服务二!
|
1天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
15 3
linux系统服务!!!
|
9天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
98 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
10天前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
55 2
Linux系统之部署Linux管理面板1Panel
|
1天前
|
网络协议 Linux
linux系统重要文件目录
本文介绍了Linux系统中的重要目录及其历史背景,包括根目录、/usr、/etc、/var/log和/proc等目录的结构和功能。其中,/etc目录下包含了许多关键配置文件,如网卡配置、DNS解析、主机名设置等。文章还详细解释了各目录和文件的作用,帮助读者更好地理解和管理Linux系统。
10 2
|
2天前
|
Ubuntu Linux Shell
Linux 系统中的代码类型或脚本类型内容
在 Linux 系统中,代码类型多样,包括 Shell 脚本、配置文件、网络配置、命令行工具和 Cron 定时任务。这些代码类型广泛应用于系统管理、自动化操作、网络配置和定期任务,掌握它们能显著提高系统管理和开发的效率。
|
5天前
|
关系型数据库 MySQL Linux
Linux系统如何设置自启动服务在MySQL数据库启动后执行?
【10月更文挑战第25天】Linux系统如何设置自启动服务在MySQL数据库启动后执行?
40 3
|
6天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
8天前
|
监控 安全 测试技术
我们为什么要API管理系统呢?
API 管理系统通过接口标准化与复用、简化开发流程、版本管理、监控与预警、访问控制、数据加密、安全审计、集中管理与共享、协作开发、快速对接外部系统和数据驱动的决策等多方面优势,显著提高开发效率、增强系统可维护性、提升系统安全性、促进团队协作与沟通,并支持业务创新与扩展。
|
8天前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###