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

目录的创建和删除

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

运行结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Linux---cp和mv命令选项

1. cp命令选项 命令选项说明-i交互式提示-r递归拷贝目录及其内容-v显示拷贝后的路径描述-a保留文件的原有权限 cp -i命令选项效果图: cp -r命令选项效果图: cp -v命令选项效果图: cp -a命令选项效果图: -a选项说明: -a 选项还支持拷贝文件夹并且文件夹中的文件权限不丢失 …

如何发布自定义 npm 组件包

准备工作 1. 注册 npm 账号 还没有 npm 账号&#xff1f;去官网注册&#xff1a; https://www.npmjs.com 需要记住用户名、密码、邮箱&#xff0c;后面需要用到。 2. 查看本地 npm 镜像&#xff0c;如果不是默认的&#xff0c;需要改回来 npm config get registry重置镜像路…

C语言--求数组的最大值和最小值【两种方法】

&#x1f357;方法一&#xff1a;用for循环遍历数组&#xff0c;找出最大值与最小值 &#x1f357;方法二&#xff1a;用qsort排序&#xff0c;让数组成为升序的有序数组&#xff0c;第一个值就是最小值&#xff0c;最后一个是最大值 完整代码&#xff1a; 方法一&#xff1a; …

国外博士论文下载网址

系列文章目录 前言 如果你想补充其他相关网址&#xff0c;请留言 一、pqdtcn 1.1 使用说明 浏览本数据库建议使用chrome浏览器&#xff01; ProQuest检索平台在今年暑假做了界面升级。为了使您能更快了解升级后的界面功能&#xff0c;ProQuest公司准备了中文版用户使用手册…

【CSS】前端点点点加载小点样式css动画过程实现

对话的 ... 加载动画&#xff0c;直接用 CSS 就可以实现&#xff0c;样式可以自己改&#xff0c;逻辑大差不差 <div class"loading-text"><span class"dot1"></span><span class"dot2"></span><span class&quo…

锁--07_1----插入意向锁-Insert加锁过程

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 插入意向锁MySQL执行插入Insert时的加锁过程MySQL官方文档MySQL insert加锁流程1.加插入意向锁2.判断插入记录是否有唯一键3. 插入记录并对记录加X锁插入意向锁----…

基于单片机的智能导盲杖设计 (论文+源码)

1. 系统设计 应用STC89C52单片机微处理器进行研究一种智能手杖系统&#xff0c;需要同时实现超声波自动测距、语音自动报警、距离自动显示、电机震动报警、LED指示灯灯光明灭自动提醒等多种功能&#xff0c;在手机通信提醒模式下手机用户可拨打固定手机电话信号实现手机通信提…

RabbitMQ插件详解:rabbitmq_message_timestamp【Rabbitmq 五】

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 RabbitMQ时空之旅&#xff1a;rabbitmq_message_timestamp的奇妙世界 前言什么是rabbitmq_message_timestamprabbitmq_message_timestamp 的定义与作用&#xff1a;如何在 RabbitMQ 中启用消息时间戳&…

【setDS】牛客小白月赛83 E

登录—专业IT笔试面试备考平台_牛客网 题意 思路 首先&#xff0c;一个必要步骤是把它转化为两个序列&#xff0c;这样就变成了一个序列DS问题 我们的答案是一个位置 pos 后面还有多少位置和这个位置的颜色相同&#xff0c;考虑得到这个答案我们需要维护什么东西 我们只需要…

Knife4j 接口文档如何设置 Authorization 鉴权参数?

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

uniapp实现检查版本检测,更新

1.首先需要获取当前app的版本 const systemInfo uni.getSystemInfoSync();// 应用程序版本号// #ifdef APPme.version systemInfo.appWgtVersion;// #endif// #ifdef H5me.version systemInfo.appVersion;// #endif2.在获取到服务器保存的app版本 3.点击按钮验证版本号 //…

每天五分钟计算机视觉:Inception网络是由多个Inception模块构成

本文重点 inception从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。可以简单的理解为Inception 网络是由一个一个的Inception模块构建成的,我们来看一下。 Inception模块 如上就是Inception模块的 通过一个1…

【AI美图】第03期效果图,AI人工智能全自动绘画,二次元美图欣赏

带来一组二次元人工智能自动绘图 对比分析&#xff1a; 标题手画二次元需要技巧&#xff1a; 二次元高清图片的绘制技巧主要包括以下几点&#xff1a; 线条的运用&#xff1a;在二次元风格的绘画中&#xff0c;线条的运用非常重要。要绘制出流畅、细腻的线条&#xff0c;需…

人工智能计算机视觉:解析现状与未来趋势

导言 随着人工智能的迅速发展&#xff0c;计算机视觉技术逐渐成为引领创新的关键领域。本文将深入探讨人工智能在计算机视觉方面的最新进展、关键挑战以及未来可能的趋势。 1. 简介 计算机视觉是人工智能的一个重要分支&#xff0c;其目标是使机器具备类似于人类视觉的能力。这…

【Spring教程29】Spring框架实战:从零开始学习SpringMVC 之 服务器响应知识全面详解

目录 1 环境准备2 响应页面3 返回文本数据4 响应JSON数据5 知识点总结 欢迎大家回到《Java教程之Spring30天快速入门》&#xff0c;本教程所有示例均基于Maven实现&#xff0c;如果您对Maven还很陌生&#xff0c;请移步本人的博文《如何在windows11下安装Maven并配置以及 IDEA配…

Java开发工具积累(符合阿里巴巴手册规范)

文章目录 一、命名规约二、集合篇1. 栈、队列、双端队列2. List的升序倒序3. Map的升序降序4. 二维数组排序5. 集合之间的转换6. Map键值对遍历 三、并发篇1. 创建线程池2. ThreadLocal的使用 四、时间篇1. LocalDateTime的使用2. String、Date、LocalDateTime转换 五、控制块1…

文件上传自动化测试方案(超详细)

一、概述 【测试地址】&#xff1a;https://pan.baidu.com 【测试工具】&#xff1a;selenium、requests 【脚本语言】&#xff1a;Python 【运行环境】&#xff1a;Windows 百度网盘作为文件存储及分享的平台&#xff0c;核心功能大部分是对文件的操作&#xff0c;如果要…

【单调栈】【区间合并】LeetCode85:最大矩形

作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的知识点 单调栈 区间合并 题目 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1…

黑马头条--day01.环境搭建

一.前言 该项目学习自黑马程序员&#xff0c;由我整理如下&#xff0c;版权归黑马程序员所有 二.环境搭建 1.数据库 第一天&#xff0c;先创建如下库和表: sql文件如下: CREATE DATABASE IF NOT EXISTS leadnews_user DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_…

VBA快速填充缺失数据

实例需求&#xff1a;数据表中F列中存在数据缺失&#xff0c;如下图所示。现需要根据A列中的内容&#xff08;类别&#xff0c;图中C1、C2、B1为不同类别&#xff09;&#xff0c;补充F列数据&#xff0c;已知每个类别中F列存在不少于一个非空单元格&#xff0c;并且其内容相同…