Linux 目录操作函数

目录操作函数

ls -l 可以查看目录中文件的信息,比如:

petri@XX:~/lesson01/05_io/目录操作函数$ ls -l a.txt
-rw-r--r-- 1 petri petri 0 Apr 22 18:51 a.txt

Linux系统中的目录操作函数:

int rename(const char *oldpath, const char *newpath); //重命名工作目录
int chdir(const char *path); //修改进程的工作目录
char *getcwd(char *buf, size_t size); //获取当前工作目录
int mkdir(const char *pathname, mode_t mode); //创建一个目录
int rmdir(const char *pathname); //移除一个目录

模拟实现 ls -l 指令:

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <pwd.h> // getpwuid()
#include <grp.h>
#include <time.h> //ctime()
#include <string.h>// 模拟实现 ls -l 指令
// -rw-rw-r-- 1 nowcoder nowcoder 12 12月  3 15:48 a.txt
int main(int argc, char * argv[]) {// 判断输入的参数是否正确if(argc < 2) {printf("%s filename\n", argv[0]);return -1;}// 通过stat函数获取用户传入的文件的信息struct stat st;int ret = stat(argv[1], &st); // 传递地址if(ret == -1) {perror("stat");return -1;}// 获取文件类型和文件权限char perms[11] = {0};   // 用于保存文件类型和文件权限的字符串switch(st.st_mode & S_IFMT) { //按位与操作(S_IFMT掩码)  获取文件类型,12-15bits有值,其余位置值为零case S_IFLNK:perms[0] = 'l';break;case S_IFDIR:perms[0] = 'd';break;case S_IFREG:perms[0] = '-';break; case S_IFBLK:perms[0] = 'b';break; case S_IFCHR:perms[0] = 'c';break; case S_IFSOCK:perms[0] = 's';break;case S_IFIFO:perms[0] = 'p';break;default:perms[0] = '?';break;}// 判断文件的访问权限// 文件所有者perms[1] = (st.st_mode & S_IRUSR) ? 'r' : '-'; // Is Read Userperms[2] = (st.st_mode & S_IWUSR) ? 'w' : '-'; // Is Write Userperms[3] = (st.st_mode & S_IXUSR) ? 'x' : '-'; // Is X User// 文件所在组perms[4] = (st.st_mode & S_IRGRP) ? 'r' : '-'; // Is Read Groupperms[5] = (st.st_mode & S_IWGRP) ? 'w' : '-'; // Is Write Groupperms[6] = (st.st_mode & S_IXGRP) ? 'x' : '-'; // Is X Group// 其他人perms[7] = (st.st_mode & S_IROTH) ? 'r' : '-'; // Is Read Otherperms[8] = (st.st_mode & S_IWOTH) ? 'w' : '-'; // Is Write Otherperms[9] = (st.st_mode & S_IXOTH) ? 'x' : '-'; // Is X Other// 硬连接数int linkNum = st.st_nlink;// 文件所有者char * fileUser = getpwuid(st.st_uid)->pw_name; // getpwuid() 函数返回一个指向结构体的指针,该结构体包含密码数据库中与用户 ID uid 匹配的记录的分隔字段。//     struct passwd {//        char   *pw_name;       /* username *///        char   *pw_passwd;     /* user password *///        uid_t   pw_uid;        /* user ID *///        gid_t   pw_gid;        /* group ID *///        char   *pw_gecos;      /* user information *///        char   *pw_dir;        /* home directory *///        char   *pw_shell;      /* shell program *///    };// 文件所在组char * fileGrp = getgrgid(st.st_gid)->gr_name; // getgrgid() 函数返回一个指向结构体的指针,该结构体包含组数据库中与组 ID gid 匹配的记录的细分字段。//     struct group {//        char   *gr_name;        /* group name *///        char   *gr_passwd;      /* group password *///        gid_t   gr_gid;         /* group ID *///        char  **gr_mem;         /* NULL-terminated array of pointers//                                   to names of group members *///     };// 文件大小long int fileSize = st.st_size;// 获取修改的时间char * time = ctime(&st.st_mtime); // 把1980年1月1号0时0分0秒到现在的秒数转换为时间// 输出char mtime[512] = {0};  strncpy(mtime, time, strlen(time) - 1); // 解决输出的  时间后面自带一个回车换行的问题。把time拷贝到mtime中,把最后一个换行去掉即可。char buf[1024];sprintf(buf, "%s %d %s %s %ld %s %s", perms, linkNum, fileUser, fileGrp, fileSize, mtime, argv[1]); //argv[0] 是 ./lsprintf("%s\n", buf);return 0;
}

编译并执行:

petri@XX:~/lesson01/05_io$ gcc ls-l.c -o ls
petri@XX:~/lesson01/05_io$ ./ls a.txt
-rw-r--r-- 1 petri petri 50 Mon Apr 22 18:40:32 2024 a.txt

1、rename

/*#include <stdio.h>int rename(const char *oldpath, const char *newpath);*/
#include <stdio.h>int main() {int ret = rename("aaa", "bbb");if(ret == -1) {perror("rename");return -1;}return 0;
}

2、chdir

在/home/nowcoder 启动了一个可执行程序a.out, 进程的工作目录就在 /home/nowcoder,chdir函数可以修改进程的工作目录

/*#include <unistd.h>int chdir(const char *path);作用:修改进程的工作目录比如在/home/nowcoder 启动了一个可执行程序a.out, 进程的工作目录 /home/nowcoder参数:path : 需要修改的工作目录#include <unistd.h>char *getcwd(char *buf, size_t size);作用:获取当前工作目录参数:- buf : 存储的路径,指向的是一个数组(传出参数)- size: 数组的大小返回值:返回的指向的一块内存,这个数据就是第一个参数buf*/
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>int main() {// 获取当前的工作目录char buf[128];getcwd(buf, sizeof(buf));printf("当前的工作目录是:%s\n", buf);// 修改工作目录int ret = chdir("/home/petri/lesson01");if(ret == -1) {perror("chdir");return -1;} // 创建一个新的文件int fd = open("chdir.txt", O_CREAT | O_RDWR, 0664);if(fd == -1) {perror("open");return -1;}close(fd);// 获取当前的工作目录char buf1[128];getcwd(buf1, sizeof(buf1));printf("当前的工作目录是:%s\n", buf1);return 0;
}

新创建的chdir.txt的保存路径是在"/home/petri/lesson01"下。

3、mkdir

/*#include <sys/stat.h>#include <sys/types.h>int mkdir(const char *pathname, mode_t mode);作用:创建一个目录参数:pathname: 创建的目录的路径mode: 权限,八进制的数返回值:成功返回0, 失败返回-1
*/#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>int main() {int ret = mkdir("aaa", 0777);if(ret == -1) {perror("mkdir");return -1;}return 0;
}

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

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

相关文章

电磁兼容(EMC):静电放电(ESD)抗扰度试验深度解读(五)

静电放电过程是一个很复杂的过程&#xff0c;下面比对人体持金属对产品放电和静电发生器对产品进行接触放电过程的详细分解说明。 1. 人持金属对产品放电过程 人对产品所产生的静电放电&#xff0c;会发生下面一系列的事件&#xff1a; 1&#xff09;当手持金属片接近产品的…

算法题解记录20+++

题目描述&#xff1a; 难度&#xff1a;简单 给你一个链表的头节点 head &#xff0c;判断链表中是否有环。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整数 pos 来…

学术论文中常见的拉丁语及其缩写词汇解析

诸神缄默不语-个人CSDN博文目录 在学术写作中&#xff0c;作者经常会使用一系列的拉丁语及其缩写词。 1. et al. 全称&#xff1a; et alii 或 et alia意义&#xff1a; 和其他人使用场景&#xff1a; 当引用的文献有多个作者时&#xff0c;通常在第一作者后使用“et al.”表…

华为路由器基于接口限速

一、背景 ISP与企业内网通过华为路由器接入Internet时,当大量流量进入路由器时,可能会因为带宽不足产生拥塞,导致丢包,严重影响用户上网体验。对于此需要对网络流量进行限制,其方式通常有防火墙带宽策略、路由器基于接口限速等。 二、华为路由器基于接口限速方式 在路由…

卸载并升级pytorch安装torcheval

Requires Python > 3.8 and PyTorch > 1.11conda list torch 查看包 pip uninstall torch 及各个包&#xff0c;nvidia-smi查看cuda11.4&#xff0c;安装对应11.3去官网找cuda11.3和torch1.11.0并粘贴命令&#xff0c;再安装torcheval pip install torch1.11.0cu113 tor…

C#各大版本特性

总目录 C# 语法总目录 C#各大版本特性目录 C#各大版本特性C#10.0C#9.0C#8.0C#7.0C#6.0C#5.0C#4.0C#3.0C#2.0 C#各大版本特性 C#10.0 支持全局using语句&#xff1a;现在可以在整个项目中使用全局using语句&#xff0c;在所有文件中自动引用命名空间&#xff0c;不需要在每个文…

【看不懂命令行、.yaml?】Hydra 库极速入门

Hydra 是一个开源的 Python 框架&#xff0c;可以简化研究和其他复杂应用程序的开发。其核心功能是通过组合动态创建层次化的配置&#xff0c;并可以通过配置文件和命令行进行覆盖。Hydra 的名字来源于它能够运行多个类似的作业 - 就像一个多头的水怪一样。 主要特性: 从多个…

汇编语言——从键盘接收一个小写字母,找出它的前导字符和后续字符,再按顺序显示这三个字符

注意的点&#xff1a; 判断输入合法性a无前导字符z无后续字符 data segment data ends stack segment stackdw 100 dup (?)top label word stack ends code segmentassume cs:code,ds:data,ss:stack main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,top L1: …

T31开发笔记: 移动侦测

若该文为原创文章&#xff0c;转载请注明原文出处。 最近在测试创安源IPC时发现摄像头的视频流有移动侦测功能 &#xff0c;拆解后发现使用的是T31,刚好手头上有淘宝买50多点的T31摄像头&#xff0c;就自己现在了个简易DEMO测试一下。 一、硬件和开发环境 1、硬件&#xff1a;…

RTT设备驱动框架学习(UART)

在serial.h中 struct rt_serial_device {struct rt_device parent;const struct rt_uart_ops *ops;struct serial_configure config;void *serial_rx;void *serial_tx;struct rt_spinlock spinlock;struct rt_device_notify rx_notify; } typedef struct rt_serial_device rt_…

C语言 分支控制语句之 if

然后 我们来说 流程控制语句之 if 选择控制结构 是通过 分支语句来实现的 其中 包括 单分支选择语句通过 (if) 来实现 双分支语句通过 (if) 和 (else) 实现 多分支语句通过 (if) (else if) (else) 实现 对于单分支来讲 它控制的语句就是 要嘛做 要嘛不做 好比如 放假了 你是…

【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix

一、RHO-1&#xff1a;不是所有的token都是必须的 论文地址&#xff1a;https://arxiv.org/pdf/2404.07965.pdf 1. 不是所有token均相等&#xff1a;token损失值的训练动态。 ​ 使用来自OpenWebMath的15B token来持续预训练Tinyllama-1B&#xff0c;每1B token保存一个che…

夜鸦国际服账号验证怎么办 夜鸦国际服账号认证的详细教程

夜鸦国际服账号验证怎么办 夜鸦国际服账号认证的详细教程 今天为大家带来的是《夜鸦》这款游戏&#xff0c;游戏背景是基于13世纪欧洲背景的MMORPG游戏&#xff0c;这款游戏以其沉浸式的游戏体验和流畅的打斗为特色。玩家可以选择战士、剑士、猎人或女巫等角色&#xff0c;体验…

AQS(AbstractQueuedSynchronizer)队列同步器源码解读

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1. 前言 2. AOS、AQS、AQLS的区别 3. AQS的底层原理 3.1. 核心思想 3.2. 数…

李廉洋:4.23黄金休市之后大幅下跌,原油小幅度上涨。走势分析!

今年以来推动金价上涨的因素是亚洲的需求&#xff0c;很可能来自各国央行。最近又有零售买盘和一些金融买盘作为补充。目前的问题是&#xff0c;不断上升的债券收益率正在争夺资金。美国2年期国债的收益率接近5%&#xff0c;在美联储降息导致收益率开始下降之前&#xff0c;这仍…

JavaScript权威指南(第7版) 笔记 - 第 7 章 数组

能用代码说清楚的&#xff0c;绝不多废话&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; Linux创始人Linus的名言&#xff1a;Talk is cheap&#xff0c;show me the code ! &#xff0c;博主技术博文会精心给出能说明问题的范例代码&#xff01;…

JMeter--监听器--聚合报告

聚合报告&#xff08;Aggregate Report&#xff09; 可以查看事务或者取样器在某个时间范围内执行的汇总结果 右键 >>> 添加 >>> 监听器 >>> 聚合报告&#xff08;Aggregate Report&#xff09; Label 样本平均值中位数90% 百分位95% 百分位99% …

Qt实现XYModem协议(五)

1 概述 XMODEM协议是一种使用拨号调制解调器的个人计算机通信中广泛使用的异步文件运输协议。这种协议以128字节块的形式传输数据&#xff0c;并且每个块都使用一个校验和过程来进行错误检测。使用循环冗余校验的与XMODEM相应的一种协议称为XMODEM-CRC。还有一种是XMODEM-1K&am…

35K的鸿蒙音视频开发岗位面经分享~

一个月前&#xff0c;阿里云在官网音视频终端 SDK 栏目发布适配 HarmonyOS NEXT 的操作文档和 SDK&#xff0c;官宣 MediaBox 音视频终端 SDK 全面适配 HarmonyOS NEXT。 此外&#xff0c;阿里云播放器 SDK 也在华为开发者联盟官网鸿蒙生态伙伴 SDK 专区同步上线&#xff0c;面…

lazarus-ide简介

Lazarus是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为使用Free Pascal编译器的Pascal语言设计。它支持快速应用开发&#xff08;RAD&#xff09;&#xff0c;允许开发者创建跨平台的图形用户界面&#xff08;GUI&#xff09;应用程序。以下是关于Lazarus的来…