linux:对目录的操作
一、对目录操作
1,打开目标目录 
 2.读取目录,,  
 3.关闭目录 
 目录 当文件看,只不过操作函数和操作文件函数不一样。
*1.opendir
DIR *opendir(const char *name);功能:打开一个目录获得一个目录流指针
 参数:name:目录名
 返回值:
     成功返回目录流指针
     失败返回NULL
*2.readdir
struct dirent *readdir(DIR *dirp);
 功能:
     从目录流中读取文件信息并将保存信息的结构体
     地址返回
 参数:
     dirp:目录流指针
 返回值:
     成功时,readdir函数返回一个指向struct dirent结构体的指针,该结构体包含了目录中的一个条目的信息,如文件名、文件类型等。
出错或者读到目录流末尾返回NULL
*3、closedir
 int closedir(DIR *dirp);
  功能:关闭之前已经打开的目录流对象
  参数:opendir的返回结果中目录流对象
  返回值:成功  0
          失败   -1;
练习:打印当前目录下的信息
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char *argv[])
{DIR * dir = opendir("./");     //使用opendir("./")打开当前目录(.表示当前目录)if(NULL == dir){fprintf(stderr,"opendir error\n");return 1;}while(1){struct dirent * info = readdir(dir);if(NULL == info){break;}switch(info->d_type){case DT_DIR:printf("目录文件 ");break;case DT_REG:printf("普通文件 ");break;case DT_UNKNOWN:printf("其他文件 ");break;default:printf("未知文件 ");}printf("%s\n",info->d_name);}closedir(dir);return 0;
}
printf("%s\n", info->d_name); 这行代码用于打印出由 readdir() 函数返回的 struct dirent 结构体中 d_name 成员所指向的字符串,即当前目录条目的名称(文件名或子目录名)。
struct dirent 是用于表示目录条目的结构体,它通常包含以下成员(但具体成员可能因系统而异):
- d_ino:文件的inode号(在某些系统上可能不存在)。
- d_off:在目录文件中的偏移量(用于内部遍历,通常不对用户程序公开)。
- d_reclen:- d_name字段的长度(不包括结尾的null字符),但在现代系统中这个字段可能不再使用。
- d_type:文件类型(如目录、普通文件等)。
- d_name:一个以null结尾的字符串,表示目录条目的名称。
二、有关目录的函数
1.chdir (cd)
chdir ("/home/linux"); "../../"
 fopen("1.mp4")
int chdir(const char *path);// /home/linux功能: 改变当前程序的工作路径
 参数:path:改变到的路径
 返回值:
     成功返回0
     失败返回-1
2.getcwd (pwd)
char *getcwd(char *buf, size_t size);功能:获得当前的工作路径
 参数:
     buf:保存工作路径空间的首地址
     size:保存路径空间的长度
 返回值:
     成功返回包含路径空间的字符串首地址
     失败返回NULL
 练习:打印当前目录,打印上一级目录
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{char buf[256]={0};getcwd(buf,sizeof(buf));printf("current path is %s\n",buf);chdir("../");getcwd(buf,sizeof(buf));printf("change path is %s\n",buf);return 0;
}
练习:指定目录下的 .c的文件
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
// ./a.out ../ 
int main(int argc, char *argv[])
{if(argc<2){fprintf(stdout,"usage:./a.out dirname\n");return 1;}DIR * dir = opendir(argv[1]);if(NULL == dir){fprintf(stderr,"opendir errpr\n");return 1;}while(1){struct dirent * info = readdir(dir);if(NULL == info){break;}// .if(strlen(info->d_name)>=3){t=strlen(info->d_name)if(0== strcmp(&info->d_name[t-2],".c"))   //strcmp(&info->d_name[t-2]定位到倒数第二位'.'{printf("%s\n",info->d_name);}}}closedir(dir);return 0;
}3.mkdir
int mkdir(const char *pathname, mode_t mode);- const char *pathname:指向以 null 结尾的字符串的指针,该字符串指定了要创建的目录的路径名。
- mode_t mode:指定新目录的权限。这些权限由文件模式创建掩码(umask)修改,以限制新目录的权限。如 0666 0777 mode & ~umask 0002
- 返回值:
 成功返回0
 失败返回-1
4.rmdir
int rmdir(const char *pathname);功能:删除一个空目录文件
 参数:pathname:目录文件的名字
 返回值:
     成功返回0
     失败返回-1
目录中有其他文件时用 rm -fr
*5.stat
int  stat(const  char  *path, struct stat *buf);
 功能:
     获得文件的属性
 参数:
     path: 文件的路径
     buf:  属性存放空间的首地址
 返回值:
     成功返回0
     失败返回-1
struct stat *buf:指向 stat 结构体的指针,该结构体用于存储 path 指定的文件或目录的状态信息。
#include <sys/types.h>  
#include <sys/stat.h>  
#include <unistd.h>  struct stat {  dev_t     st_dev;     // 设备ID(文件所在的设备)  ino_t     st_ino;     // 节点号(inode号)  mode_t    st_mode;    // 文件类型和权限  nlink_t   st_nlink;   // 链接数(有多少文件名指向这个节点)  uid_t     st_uid;     // 用户ID(文件所有者的用户ID)  gid_t     st_gid;     // 组ID(文件所有者的组ID)  dev_t     st_rdev;    // 设备类型(如果文件是设备)  off_t     st_size;    // 文件大小(以字节为单位)  blksize_t st_blksize; // 文件系统I/O的块大小  blkcnt_t  st_blocks;  // 分配给文件的块数  // 以下成员与时间相关  time_t    st_atime;   // 最后访问时间  time_t    st_mtime;   // 最后修改时间  time_t    st_ctime;   // 最后状态改变时间(例如权限或所有权)  // POSIX.1-2008 增加了以下成员  #ifdef _POSIX_C_SOURCE  // ... 可能包含额外的成员,如 st_birthtime(文件的创建时间,如果支持)  #endif  
};
 练习:用stat获取文件信息
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
int main(int argc, char *argv[])
{struct stat st;char filename[]="./01ls.c";int ret= stat(filename,&st); if(-1 == ret){fprintf(stderr,"stat error\n");return 1;}printf("ino:%lu mode:%d link:%lu uid:%u gid:%u size:%lu time:%lu %s\n",st.st_ino,st.st_mode,st.st_nlink,st.st_uid,st.st_gid,st.st_size,st.st_mtime,filename);return 0;
}st_mode字段是stat结构体的一部分,该结构体通过stat(), fstat(), 或 lstat()函数获取文件或目录的状态信息。我们可以通过一系列的宏(定义在<sys/stat.h>或<sys/types.h>头文件中)来访问和操作st_mode字段中的不同部分。
st_mode有32bit,最后9位表示权限,以下表示权限:
           S_IRWXU     00700   owner has read, write, and execute permissionS_IRUSR     00400   owner has read permissionS_IWUSR     00200   owner has write permissionS_IXUSR     00100   owner has execute permissionS_IRWXG     00070   group has read, write, and execute permissionS_IRGRP     00040   group has read permissionS_IWGRP     00020   group has write permissionS_IXGRP     00010   group has execute permissionS_IRWXO     00007   others (not in group) have read,  write,  andexecute permissionS_IROTH     00004   others have read permissionS_IWOTH     00002   others have write permissionS_IXOTH     00001   others have execute permission
 st_modes的使用:
#include <sys/types.h>  
#include <sys/stat.h>  
#include <unistd.h>  
#include <stdio.h>  
#include <time.h> // 用于可能的时间格式化,但这里未使用  int main(int argc, char *argv[])  
{  struct stat st;  char filename[] = "./01ls.c";  int ret = stat(filename, &st);  if (-1 == ret) {  fprintf(stderr, "stat error\n");  return 1;  }  // 输出文件类型  if (S_ISREG(st.st_mode))    //如果 st_mode 的文件类型位与 S_ISREG 宏定义的掩码相匹配,则 S_ISREG(st.st_mode) 将返回非零值(通常为真),表示 该文件是一个普通文件。{  fputc('-', stdout);  } else if (S_ISDIR(st.st_mode))  {  fputc('d', stdout);  } else {  fputc('o', stdout); // 其他类型  }  // 输出文件权限  printf("%c%c%c",  (st.st_mode & S_IRUSR) ? 'r' : '-',  (st.st_mode & S_IWUSR) ? 'w' : '-',  (st.st_mode & S_IXUSR) ? 'x' : '-'  );  // 组权限  printf("%c%c%c",  (st.st_mode & S_IRGRP) ? 'r' : '-',  (st.st_mode & S_IWGRP) ? 'w' : '-',  (st.st_mode & S_IXGRP) ? 'x' : '-'  );  // 其他用户权限  printf("%c%c%c",  (st.st_mode & S_IROTH) ? 'r' : '-',  (st.st_mode & S_IWOTH) ? 'w' : '-',  (st.st_mode & S_IXOTH) ? 'x' : '-'  );  // 输出硬链接数、用户ID、组ID、文件大小、最后修改时间(秒数)和文件名  printf(" %lu %u %u %lu %lu %s\n",  st.st_nlink, st.st_uid, st.st_gid, st.st_size, (unsigned long)st.st_mtime, filename);  return 0;  
}三、获取时间
1.获取秒数    
 2.转换为需要个格式    
1.time
time_t time(time_t *t);
功能:获得1970年到现在的秒数
 参数:t:存放秒数的空间首地址
 返回值:
     成功返回1970年到现在的秒数
     失败返回-1
 使用:先定义time_t tm;
 方式1:time(&tm);方式2:tm = time(NULL);
2.ctime
char *ctime(const time_t *timep);//date
 功能:将时间秒数转化成字符串
 参数:timep:保存时间空间的地址
 返回值:
     成功返回获得时间字符串的首地址
     失败返回NULL
3、localtime
struct tm *localtime(const time_t *timep);
 功能:将一个秒数转化成日历时间
 参数:timep:保存秒数空间的地址
 返回值:
     成功返回保存日历时间结构体的指针
     失败返回NULL
struct tm 
  {
 int tm_sec;         /* seconds */
 int tm_min;         /* minutes */
 int tm_hour;        /* hours */
 int tm_mday;        /* day of the month */
 int tm_mon;         /* month */
 int tm_year;        /* year */
 int tm_wday;        /* day of the week */
 int tm_yday;        /* day in the year */
 int tm_isdst;       /* daylight saving time */
 };
练习:先用stat获取文件的秒数,再用localtime转换
#include<time.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
int main(int argc, const char *argv[])
{struct stat s;stat("./2.txt",&s);time_t tm;tm=s.st_mtime;//time(&tm);//printf("%s\n",ctime(&tm));struct tm *t=localtime(&tm);printf("%d-%d-%d %d:%d:%d\n",t->tm_year+1900 ,t->tm_mon+1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);return 0;
}
相关文章:
linux:对目录的操作
一、对目录操作 1,打开目标目录 2.读取目录,, 3.关闭目录 目录 当文件看,只不过操作函数和操作文件函数不一样。 *1.opendir DIR *opendir(const char *name); 功能:打开一个目录获得一个目录流指针 参数:name:目录名 返回值…...
 
详解Redis 高可用的方式 Redis Cluster
Redis 高可用方式 Redis 提供了多种高可用性方案,主要包括以下几种方式: 主从复制(Replication) 主从复制是最基本的高可用性方案,通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...
$clog2(1)=0
项目场景: 写ip 时, 使用参数化的方式实现2w1r 时,出现计算读返回index 时,减下溢! 问题描述 verilog中会使用parameter 参数化,例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...
 
开发学习日记1
用这个系列博客记录下学习开发的一些小收获 git的使用: 说来惭愧,学到了大二,git的使用还是一团糟,记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支(克隆一下其他分支ÿ…...
 
孙宇晨领航波场TRON:引领数字资产迈向崭新纪元
 在风起云涌的数字资产领域,孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人,他不仅是一位远见卓识的领导者,更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来,孙宇晨便以其敏锐的洞察力…...
python运维(twenty-four day)
一、python基础 1、环境python2、python3 [rootpython ~]# yum list installed | grep python #检查是否有python包 [rootpython ~]# yum list installed | grep epel #检查是否有epel包 [rootpython ~]# yum -y install epel-release [rootpython ~]# yum -y instal…...
Eureka原理实践
1. 简介 1.1. 概述 Eureka是Netflix开源的一个服务注册与发现框架,它在微服务架构中扮演着至关重要的角色。 Eureka由两个核心组件组成: Eureka Server(服务注册中心):负责存储、管理和提供服务实例信息,如服务名、IP地址、端口号等。Eureka Server通常采用集群部署以保…...
Ant-Design-Vue快速上手指南+排坑
1. 简介 1.1. 概述 Ant-Design-Vue是由阿里巴巴开源的一个基于Vue.js框架的企业级UI设计语言。它旨在帮助开发者构建设计优雅、体验流畅的企业级应用。Ant-Design-Vue提供了一系列高质量的Vue组件,包括表单、表格、布局、导航、图标等,可以帮助开发者快速搭建应用程序界面。…...
 
mysql5.7安装
1.创建一个software文件 2.先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 3安装源包 rpm -ivh mysql-community-release-el7-5.noarch.rpm 可能会报错 改成命令 rpm -ivh mysql-community-release-el7-5.noarch.rpm --nodeps…...
 
UE开发中的设计模式(三) —— 对象池模式
在FPS游戏中,射击会生成子弹,在命中敌人后子弹会被销毁,那么会导致子弹对象频繁地创建和销毁,会造成运行效率降低且会产生内存碎片问题,而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…...
Mocha测试框架:JavaScript自动化测试的瑞士军刀
在JavaScript开发中,自动化测试是确保代码质量和可靠性的关键环节。Mocha是一个广泛使用的JavaScript测试框架,它支持多种断言库,允许开发者编写简洁、灵活的测试用例。Mocha特别适用于Node.js环境,但也可以在浏览器中运行。本文将…...
flask实现Streaming内容传输
当传输大量内存,以至于超出内存大小,一般http服务器会报500错误,这时可以使用Streaming流的方式来传输内容,类似ChatGPT和视频流那样的输出方式,flask里要用到生成器和直接响应。 from flask import stream_with_cont…...
 
seata的使用(SpringBoot项目整合seata)
文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现: 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…...
 
docker容器和宿主机网络不通
防火墙未开启,检查网络配置无异常 解决: [rootlocalhost ~]# vim /etc/sysctl.confnet.bridge.beidge-nf-call-iptables 1 net.bridge.beidge-nf-call-ip6tables 1[rootlocalhost ~]# sysctl -p [rootlocalhost ~]# systemctl restart docker 如果网…...
编程学习之旅:高效记录与整理笔记的艺术
引言:知识的海洋与导航的灯塔 在编程的浩瀚星空中,每一位学习者都像是勇敢的航海家,驾驶着知识的帆船,在无尽的信息海洋中探索未知的领域。然而,这片海洋既充满了机遇,也潜藏着挑战。信息的过载、知识的碎…...
 
dev c++中,在C++11模式下编译带M_PI宏的文件报错的解决办法
一、问题描述 当使用C11的模式,编译引用了math库中的M_PI的源文件时,报M_PI未声明的错误。 二、问题原因 因为M_PI是GNU扩展的宏,它不属于C11的标准,而-stdc11,表示以C11的标准进行编译,因此会产生以上问…...
【ubutnu24.04】k8s部署2:摸索修复问题
1.30.0 一直init失败有人说版本兼容问题重新安装了最新的1.31.0 版本kubeadm init 仍旧失败。安装依赖项 sudo apt-get install -y apt-transport-https ca-certificates curl gpgroot@PerfSvr:/home/zhangbin/perfwork/k8sadmin# sudo apt-get install -y apt-transport-https…...
处理JSON数据时遇到的解析错误:“Unexpected character (`“`)”
问题背景 在开发过程中,经常会遇到需要解析JSON数据的情况。然而,在某些情况下,可能会遇到类似“Unexpected character (")”这样的错误。本文将详细介绍该错误的原因、如何诊断以及解决方法。 错误示例 以下是一个典型的错误信息示例…...
RDKit|分子输入输出格式解析(如 SMILES、Mol、SDF)
2.3 分子输入输出格式解析(如 SMILES、Mol、SDF) 在化学信息学中,分子的表示方式有很多种,常见的包括 SMILES、Mol 文件、SDF 文件等。RDKit 支持对这些格式的分子数据进行解析和处理,这使得它在化学和药物设计领域得到了广泛应用。本节将介绍如何在 RDKit 中解析和操作这…...
 
【模电笔记】——反馈放大电路
tips:本章节的笔记已经打包到word文档里啦,建议大家下载文章顶部资源(有时看不到是在审核中,等等就能下载了。手机端下载后里面的插图可能会乱,建议电脑下载,兼容性更好且易于观看),…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
 
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
