《Linux C编程实战》笔记:目录操作

news2024/9/20 6:42:30

目录的创建和删除

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

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1317018.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MuMu模拟器12如何连接adb?

一、MuMu模拟器12端口查看 MuMu模拟器12现已支持adb同时连接多个模拟器进行调试的操作&#xff0c;可以参考以下步骤操作&#xff0c;查看MuMu模拟器12本体以及多开模拟器的adb端口&#xff1a; 单开的MUMU模拟器12可通过模拟器右上角菜单-问题诊断&#xff0c;获取ADB调试端…

医药行业的数据安全革新者:上海迅软DSE成功案例揭秘

随着网络化办公在医药企业中不断的深入应用&#xff0c;企业内部的药品保密配方、研发成果、技术资料等重要信息都散布在电脑或流转于网络之中&#xff0c;同时各种内部系统又集中存放着大量的敏感数据&#xff0c;一旦这些数据资产发生泄密&#xff0c;将对企业的持续运营造成…

消息队列有哪些应用场景?

分布式系统不同模块之间的通信&#xff0c;除了远程服务调用以外&#xff0c;消息中间件是另外一个重要的手段&#xff0c;在各种互联网系统设计中&#xff0c;消息队列有着广泛的应用。从本文开始&#xff0c;专栏进入分布式消息的模块&#xff0c;将讨论消息队列使用中的高频…

前端如何设置模板参数

1.背景&#xff1a; 最近接到一个需求&#xff0c;在一个类似chatGpt的聊天工具中&#xff0c;要在对话框中设置模板&#xff0c;后端提供了很多模板参数&#xff0c;然后要求将后端返回的特殊字符转成按钮&#xff0c;编辑完成后在相应的位置拼接成字符串。 2.效果&#xff1a…

Java 并发编程(六)-Fork/Join异步回调

一、并发编程 1、Fork/Join分支合并框架 Fork/Join它可以将一个大的任务拆分成多个子任务进行并行处理&#xff0c;最后将子任务结果合并成最后的计算结果&#xff0c;并进行输出。Fork/Join框架要完成两件事情&#xff1a; Fork&#xff1a;把一个复杂任务进行分拆&#xff0…

嵌入式系统基础

嵌入式系统学习的3条路线 路线差别 单片机入门&#xff08;HAL&#xff09; 简单、快速&#xff0c;实际上工作中涉及单片机编程时&#xff0c;也提倡使用HAL库。对于学习来说&#xff0c;HAL库封装了很多技术细节&#xff0c;对技术成长帮助不大。 比如&#xff0c;可能接触…

前后端开发鄙视链的真相,希望对从事前后端开发的小伙伴有些帮助

一、常规的工资对比 前后端的工资情况怎么样?过来人可以负责任的告诉大家:据我所知,至少在杭的网易、阿里,前端跟后端是一个批发价。

探索泰勒级数在机器学习中的作用:从函数逼近到模型优化

一、介绍 泰勒级数是数学中的一个基本概念&#xff0c;在机器学习领域有着重要的应用。本文将探讨泰勒级数的基础知识、它在机器学习中的相关性以及一些具体应用。 揭开复杂性&#xff1a;利用泰勒级数增强机器学习应用的理解和效率。 二、理解泰勒级数 在数学中&#xff0c;泰…

excel手撕神经网络(只需高中数学基础)

神经网络最基础部分是由神经元组成&#xff0c;一个神经元相当于是一个一次函数&#xff0c;yaxb 即在已知x&#xff0c;和y情况下&#xff0c;怎么使用神经网络求解a和b 如下是使用excel求解的神经网络&#xff0c;可以方便理解神经网络运行原理 excel玩具神经网络下载地址 百…

swing快速入门(十五)

注释很详细&#xff0c;直接上代码 上一篇 新增内容 1.文件对话框&#xff08;保存文件&#xff09; 2.文件对话框&#xff08;打开文件&#xff09; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener;public class swing_tes…

软实力篇---第五篇

系列文章目录 文章目录 系列文章目录前言一、HR 最喜欢问程序员的 20 个问题二、面试中的礼仪与举止前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、HR 最喜欢…

tomcat启动异常:子容器启动失败(a child container failed during start)

最近在使用eclipse启动Tomcat时&#xff0c;发现一个问题&#xff0c;启动以前的项目突然报子容器启动异常。 异常信息如下&#xff1a; 严重: 子容器启动失败 java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: 无法启动组件[org.apache.…

运维对数据库的一些要求(安装,部署,权限,mysqldump,xtrabackup的备份和还原)

目录 一、安装部署二、数据库的权限分配1.密码策略2.MySQL中授权(grant)和撤销授权(revoke&#xff09; 三、数据库的备份还原1、mysqldump备份数据库2、Percona XtraBackup备份数据库1、Percona XtraBackup的介绍2、Percona XtraBackup安装3、Percona XtraBackup8.0的使用1.全…

低代码是什么?可能取代人工吗?

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美味的膳食还是垃圾食品呢&#xff0c;…

PyCharm控制台异常堆栈乱码问题解决

目录 1、问题描述2、问题原因3、问题解决 1、问题描述 PyCharm环境都已经配置成了UTF-8编码&#xff0c;控制台打印中文也不会出现乱码&#xff0c;但异常堆栈信息中如果有中文会出现中文乱码&#xff1a; 这种该怎么解决呢&#xff1f; 2、问题原因 未将PyCharm编码环境与项目…

如何使用ycsb工具对mongodb进行性能测试过程

测试环境&#xff1a; linux系统&#xff1a;Centos 7.2 ,版本&#xff1a;Red Hat 4.8.5-44) YCSB简介 ycsb是一款性能测试工具&#xff0c;用Java写的&#xff0c;并且什么都可以压&#xff0c;像是mongodb&#xff0c;redis&#xff0c;mysql&#xff0c;hbase&#xff0c;等…

Leetcode的AC指南 —— 链表:19.删除链表的倒数第N个节点

摘要&#xff1a; Leetcode的AC指南 —— 链表&#xff1a;19.删除链表的倒数第N个节点。题目介绍&#xff1a;给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 文章目录 一、题目二、解析1、滑动窗口/快慢指针&#xff08;傻傻分不清&…

探索灵活性与可维护性的利器:策略(Strategy)模式详解

目录 ​编辑 1. 策略模式概述&#xff1a; 2. 主要角色&#xff1a; 3. 实例场景&#xff1a; 4. 具体实现步骤&#xff1a; 步骤一&#xff1a;定义策略接口 5. 使用策略模式的客户端代码&#xff1a; 总结&#xff1a; 我的其他博客 1. 策略模式概述&#xff1a; 策…

【Jmeter】Jmeter基础6-Jmeter元件介绍之前置处理器

前置处理器主要用于处理请求前的准备工作&#xff0c;如&#xff1a;参数、环境变量的设置等。 2.6.1、JSR223预处理程序 作用&#xff1a;请求前的准备工作。 参数说明&#xff1a; 语言&#xff1a;开发脚本所使用的语言&#xff0c;可通过下拉列表选择。参数&#xff1a;传…

Vue3快速上手笔记

Vue3快速上手 1.Vue3简介 2020年9月18日&#xff0c;Vue.js发布3.0版本&#xff0c;代号&#xff1a;One Piece&#xff08;海贼王&#xff09;耗时2年多、2600次提交、30个RFC、600次PR、99位贡献者github上的tags地址&#xff1a;https://github.com/vuejs/vue-next/release…