当前位置: 首页 > news >正文

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_reclend_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.读取目录&#xff0c;&#xff0c; 3.关闭目录 目录 当文件看&#xff0c;只不过操作函数和操作文件函数不一样。 *1.opendir DIR *opendir(const char *name); 功能:打开一个目录获得一个目录流指针 参数:name:目录名 返回值&#xf…...

详解Redis 高可用的方式 Redis Cluster

Redis 高可用方式 Redis 提供了多种高可用性方案&#xff0c;主要包括以下几种方式&#xff1a; 主从复制&#xff08;Replication&#xff09; 主从复制是最基本的高可用性方案&#xff0c;通过将数据从一个主节点复制到多个从节点来实现数据的冗余和读写分离。主节点负责所…...

$clog2(1)=0

项目场景&#xff1a; 写ip 时&#xff0c; 使用参数化的方式实现2w1r 时&#xff0c;出现计算读返回index 时&#xff0c;减下溢&#xff01; 问题描述 verilog中会使用parameter 参数化&#xff0c;例如使用dpth 和$clog2(dpth)addr 。 常见的写法没有什么问题。 module …...

开发学习日记1

用这个系列博客记录下学习开发的一些小收获 git的使用&#xff1a; 说来惭愧&#xff0c;学到了大二&#xff0c;git的使用还是一团糟&#xff0c;记录一下如何使用git进行团队合作开发 当要加入其他人的项目时首先你要创建自己的分支&#xff08;克隆一下其他分支&#xff…...

孙宇晨领航波场TRON:引领数字资产迈向崭新纪元

​ 在风起云涌的数字资产领域&#xff0c;孙宇晨这个名字始终与创新、突破和引领紧密相连。作为波场TRON的创始人&#xff0c;他不仅是一位远见卓识的领导者&#xff0c;更是推动数字资产迈向新纪元的坚实力量。 自波场TRON诞生以来&#xff0c;孙宇晨便以其敏锐的洞察力…...

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游戏中&#xff0c;射击会生成子弹&#xff0c;在命中敌人后子弹会被销毁&#xff0c;那么会导致子弹对象频繁地创建和销毁&#xff0c;会造成运行效率降低且会产生内存碎片问题&#xff0c;而对象池模式可以很好地解决这个问题。 文章目录 问题提出概述问题解决总结 问题…...

Mocha测试框架:JavaScript自动化测试的瑞士军刀

在JavaScript开发中&#xff0c;自动化测试是确保代码质量和可靠性的关键环节。Mocha是一个广泛使用的JavaScript测试框架&#xff0c;它支持多种断言库&#xff0c;允许开发者编写简洁、灵活的测试用例。Mocha特别适用于Node.js环境&#xff0c;但也可以在浏览器中运行。本文将…...

flask实现Streaming内容传输

当传输大量内存&#xff0c;以至于超出内存大小&#xff0c;一般http服务器会报500错误&#xff0c;这时可以使用Streaming流的方式来传输内容&#xff0c;类似ChatGPT和视频流那样的输出方式&#xff0c;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、代码实现&#xff1a; 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…...

docker容器和宿主机网络不通

防火墙未开启&#xff0c;检查网络配置无异常 解决&#xff1a; [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 如果网…...

编程学习之旅:高效记录与整理笔记的艺术

引言&#xff1a;知识的海洋与导航的灯塔 在编程的浩瀚星空中&#xff0c;每一位学习者都像是勇敢的航海家&#xff0c;驾驶着知识的帆船&#xff0c;在无尽的信息海洋中探索未知的领域。然而&#xff0c;这片海洋既充满了机遇&#xff0c;也潜藏着挑战。信息的过载、知识的碎…...

dev c++中,在C++11模式下编译带M_PI宏的文件报错的解决办法

一、问题描述 当使用C11的模式&#xff0c;编译引用了math库中的M_PI的源文件时&#xff0c;报M_PI未声明的错误。 二、问题原因 因为M_PI是GNU扩展的宏&#xff0c;它不属于C11的标准&#xff0c;而-stdc11&#xff0c;表示以C11的标准进行编译&#xff0c;因此会产生以上问…...

【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 (`“`)”

问题背景 在开发过程中&#xff0c;经常会遇到需要解析JSON数据的情况。然而&#xff0c;在某些情况下&#xff0c;可能会遇到类似“Unexpected character (")”这样的错误。本文将详细介绍该错误的原因、如何诊断以及解决方法。 错误示例 以下是一个典型的错误信息示例…...

RDKit|分子输入输出格式解析(如 SMILES、Mol、SDF)

2.3 分子输入输出格式解析(如 SMILES、Mol、SDF) 在化学信息学中,分子的表示方式有很多种,常见的包括 SMILES、Mol 文件、SDF 文件等。RDKit 支持对这些格式的分子数据进行解析和处理,这使得它在化学和药物设计领域得到了广泛应用。本节将介绍如何在 RDKit 中解析和操作这…...

【模电笔记】——反馈放大电路

tips&#xff1a;本章节的笔记已经打包到word文档里啦&#xff0c;建议大家下载文章顶部资源&#xff08;有时看不到是在审核中&#xff0c;等等就能下载了。手机端下载后里面的插图可能会乱&#xff0c;建议电脑下载&#xff0c;兼容性更好且易于观看&#xff09;&#xff0c;…...

【面试题】Redis缓存问题全解:击穿、雪崩与穿透

文章目录 Redis缓存问题全解&#xff1a;击穿、雪崩与穿透引言1. 缓存击穿&#xff08;Cache Penetration&#xff09;2. 缓存雪崩&#xff08;Cache Avalanche&#xff09;3. 缓存穿透&#xff08;Cache Penetration&#xff09; 总结1. 缓存击穿&#xff08;Cache Penetratio…...

676. 实现一个魔法字典

676. 实现一个魔法字典 题目链接&#xff1a;676. 实现一个魔法字典 代码如下&#xff1a; class MagicDictionary { public:MagicDictionary() {}void buildDict(vector<string> dictionary) {wordsdictionary;}bool search(string searchWord) {for(const auto&…...

Spring Boot 入门以及对微服务的理解

目录 1.Spring Boot 简介 1.1什么是自动装配 1.2什么是内嵌Tomcat 2.微服务 2.1单体应用系统 2.2分布式应用系统 2.3微服务 2.3.1什么是微服务 微服务有哪些优点 微服务有哪些缺点 2.3.2为什么选择微服务 1.Spring Boot 简介 Spring Boot 是简化 Spring 应用开发的…...

仿RabbiteMq实现简易消息队列正式篇(需求分析)

TOC 目录 MQ的实现方法 RabbitMq中的相关概念 消息队列系统模块划分 总体划分 服务端模块 数据管理模块 虚拟机数据管理模块 交换机路由模块 消费者管理模块 信道&#xff08;通信&#xff09;管理模块 连接管理模块 服务端BrokerServer模块 客户端模块 消费者管…...

Python酷库之旅-第三方库Pandas(082)

目录 一、用法精讲 341、pandas.Series.str.startswith方法 341-1、语法 341-2、参数 341-3、功能 341-4、返回值 341-5、说明 341-6、用法 341-6-1、数据准备 341-6-2、代码示例 341-6-3、结果输出 342、pandas.Series.str.strip方法 342-1、语法 342-2、参数 …...

0101中文乱码-BufferedImage-图片处理

文章目录 1、问题描述2 、电子证书生成3、中文乱码原因及修复4、思考 结语 1、问题描述 接手维护一个休闲赛事类项目&#xff0c;因为服务器到期&#xff0c;项目从云服务器迁移到本地服务器。 项目生成比赛&#xff0c;分为二人组、三人组等等的团体&#xff1b;比赛设置几个…...

[Qt][Qt 事件][下]详细讲解

目录 1.定时器0.是什么&#xff1f;1.QTimerEvent2.QTimer3.获取系统⽇期及时间 2.事件分发器1.概述2.事件分发器工作原理3.使用 3.事件过滤器0.是什么&#xff1f;2.使用 1.定时器 0.是什么&#xff1f; 在进⾏窗⼝程序的处理过程中&#xff0c;经常要周期性的执⾏某些操作&…...

八股总结----计算机网络

0.OSI七层模型 自己的理解&#xff1a;应用层&#xff1a;生成HTTP请求报文-----表示层&#xff1a;将请求报文转换成适合网络传输的数据格式&#xff0c;加密压缩编码等-----会话层&#xff1a;管理两个应用程序之间的会话&#xff0c;包括连接中断等------传输层&#xff1a…...

Laravel 框架开发 ERP 系统,技术选型和分析以及实施计划

目录 技术选型 技术分析 实施计划 实施步骤 可能需要引入的组件包 技术难点及解决方案 基于 Laravel 框架开发 ERP 系统&#xff0c;技术选型和分析以及实施计划需要考虑多个方面&#xff1a; 技术选型 后端框架&#xff1a;Laravel&#xff0c;因为它提供了丰富的功能…...

【Vue3】嵌套路由

【Vue3】嵌套路由 背景简介开发环境开发步骤及源码 背景 随着年龄的增长&#xff0c;很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来&#xff0c;技术出身的人总是很难放下一些执念&#xff0c;遂将这些知识整理成文&#xff0c;以纪念曾经努力学习奋斗的日子。本文内…...