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

运行结果:

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

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

相关文章

[Linux] LVS负载均衡群集+NAT部署

一、LVS负载均衡群集知识 1.1 群集的的定义及意义 Cluster&#xff0c;集群&#xff08;也称群集&#xff09;由多台主机构成&#xff0c;但对外只表现为一一个整体&#xff0c;只提供一-个访问入口(域名或IP地址)&#xff0c; 相当于一台大型计算机。 群集的作用&#xff1…

vue3使用Mars3D写区块地图

效果图 引入相关文件 因为我也是第一次使用&#xff0c;所以我是把插件和源文件都引入了&#xff0c;能使用启动 源文件 下载地址&#xff1a; http://mars3d.cn/download.html 放入位置 在index.html中引入 <!--引入cesium基础lib--><link href"/static/C…

Kubernetes 容器编排 -- 1

前言 知识扩展 早在 2015 年 5 月&#xff0c;Kubernetes 在 Google 上的搜索热度就已经超过了 Mesos 和 Docker Swarm&#xff0c;从那儿之后更是一路飙升&#xff0c;将对手甩开了十几条街,容器编排引擎领域的三足鼎立时代结束。 目前&#xff0c;AWS、Azure、Google、阿里…

软考科目如何选择?

软考科目繁多&#xff0c;让许多学弟学妹感到困惑&#xff0c;不知道该选择哪个科目。以下是一些建议&#xff0c;可以根据个人实际需求选择备考的科目。 1、初级是可选的 软考初级非常简单&#xff0c;适合刚刚入门学习的朋友报考。对于一些有基础的朋友&#xff0c;建议直接…

【从零开始学习--设计模式--装饰者模式】

返回首页 前言 感谢各位同学的关注与支持&#xff0c;我会一直更新此专题&#xff0c;竭尽所能整理出更为详细的内容分享给大家&#xff0c;但碍于时间及精力有限&#xff0c;代码分享较少&#xff0c;后续会把所有代码示例整理到github&#xff0c;敬请期待。 此章节介绍装…

java实现局域网内视频投屏播放(二)爬虫

代码链接 视频播放原理 大多视频网站使用的是m3u8&#xff0c;m3u8其实不是一个真正的视频文件&#xff0c;而是一个视频播放列表&#xff08;playlist&#xff09;。它是一种文本文件&#xff0c;里面记录了一系列的视频片段&#xff08;segment&#xff09;的网络地址。这些…

原来定时发朋友圈设置这么简单?看完我也会了

目前微信作为最大的社交平台之一&#xff0c;吸引了众多使用者。你是否听过有些朋友感叹这么多微信号&#xff0c;需要每天手动发布朋友圈&#xff0c;任务很繁琐呢&#xff1f;是否希望可以事先设置好定时发送的功能&#xff0c;让朋友圈自动更新&#xff0c;省去手动发送的麻…

初探栈溢出(下)

0x04 漏洞利用 作为脚本小子&#xff0c;先跑一下写好了的exploit脚本。 打开HackSysEVDExploit.sln文件&#xff0c;直接在vs2019上编译即可。 将生成的HackSysEVDExploit.exe拷贝至win7&#xff0c;执行如下命令 直接可以获取system权限。 那么只跑一下脚本肯定不行&#…

世微 锂电池保护IC DW01 充电器检测过充保护SOT23-6

一、 描述 DW01A 是一个锂电池保护电路&#xff0c;为避免锂电池因过充电、过放电、电流过大导致电池寿命缩短或电池被损坏而设计的。它具有高精确度的电压检测与时间延迟电路。 二、 主要特点 工作电流低 过充检测 4.3V&#xff0c;过充释放 4.05V&#xff1b; 过放检测 2.4…

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

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

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1…

【JavaEE】锁的策略

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…

20.Java程序设计-基于SSM框架的安卓掌上校园生活系统的设计与实现

摘要&#xff1a; 随着移动互联网技术的快速发展&#xff0c;校园生活信息化成为提高学校管理效率、方便学生生活的关键。本研究以基于SSM&#xff08;Spring Spring MVC MyBatis&#xff09;框架的技术体系为基础&#xff0c;致力于设计与实现一款功能强大、高效稳定的安卓…

现代雷达车载应用——第2章 汽车雷达系统原理 2.6节 雷达设计考虑

经典著作&#xff0c;值得一读&#xff0c;英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.6 雷达设计考虑 上述部分给出了汽车雷达基本原理的简要概述。在雷达系统的设计中&#xff0c;有几个方面是必不可少的&#xff0c;它们决定了雷达系…

VUE学习三、前端项目部署

1.前端项目打包 执行命令 npm run build:prod正常命令结束 , 会在前端项目里面出现dist文件夹 2.nginx下载安装 nginx下载 : http://nginx.org/en/download.html Windows 下载版本 Mainline version&#xff1a;Mainline 是 Nginx 目前主力在做的版本&#xff0c;可以说…

《使用ThinkPHP6开发项目》 - ThinkPHP6使用使用中间件验证登录Token

https://blog.csdn.net/centaury32/article/details/134997438 按照https://blog.csdn.net/centaury32/article/details/134999029的方法验证登录Token&#xff0c;那么每一步都需要写同样一段代码&#xff0c;这里可以结合中间件进行验证 一、创建中间件&#xff1a;php thi…

QT----第三天,Visio stdio自定义封装控件,鼠标事件,定时器,事件分发器过滤器,绘图事件

目录 第三天1 自定义控件封装2 QT鼠标事件3 定时器4 event事件分发器5 事件过滤器6 绘图事件Qpainter 源码&#xff1a;CPP学习代码 第三天 1 自定义控件封装 新建一个QT widgetclass&#xff0c;同时生成ui,h,cpp文件 在smallWidget.ui里添加上你想要的控件并调试大小 回到…

ISSUE的基本概念

ISSUE:将符合一定条件的指令从发射队列&#xff08;IssueQueue)中选出来&#xff0c;并送到FU中执行的过程; ISSUE QUEUE也称之为reservation station, 其按照一定的规则&#xff0c;选择那些源操作数都已经准备好的指令&#xff0c;将其送到FU中执行&#xff0c;这个过程称为…

11.jvm第三方工具使用实践

目录 概述GCEasy官网jvm内存占用情况关键性能指标堆内存与元空间优化 MAT安装MAT相关概念说明内存泄漏与内存溢出shallow heap及retained heapoutgoing references与incoming referencesDominator Tree GCViewerArthas下载安装与启动jdk8jdk 11jdk11自定义boot jarjdk17 常用命…

LVS负载均衡集群和NAT模式部署

目录 一、群集的类型及含义 二、LVS的三种工作模式 一、根据群集所针对的目标差异&#xff0c;可分为三种类型 二、LVS的负载调度算法 三、ipvsadm 工具选项 四、NAT模式 LVS负载均衡群集部署 1.共享服务器配置&#xff1a; 2.节点服务器1配置 3.节点服务器2 4.配置负…