时间获取、文件属性获取 2月20日学习笔记

执行两次代码,打印出两次执行过程中新增的文件及删除的文件

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <dirent.h>#define	RECORD_PATH		"record.bk"int ListDir(const char *pdirname, FILE *file) //遍历指定目录下的所有文件和子目录,并将文件路径写入到指定的文件中
{DIR *dp = NULL;struct dirent *pp = NULL;char tmpbuff[1024] = {0};dp = opendir(pdirname);if (NULL == dp){perror("fail to opendir");return -1;}while (1){pp = readdir(dp);if (NULL == pp){break;}if ('.' == pp->d_name[0]){continue;}sprintf(tmpbuff, "%s/%s", pdirname, pp->d_name);fprintf(file, "%s\n", tmpbuff);if (DT_DIR == pp->d_type){ListDir(tmpbuff, file);}}closedir(dp);return 0;
}int ListDirToRecord(const char *pdirname)//使用ListDir函数遍历指定目录,并将结果写入到名为record.bk的文件中。
{FILE *fp = NULL;fp = fopen(RECORD_PATH, "w");if (NULL == fp){perror("fail to fopen");return -1;}ListDir(pdirname, fp);fclose(fp);return 0;
}int ShowDeleteFiles(void)//打开record.bk文件,读取其中的文件路径,并判断这些文件是否存在于文件系统中。如果不存在,则打印这些文件路径,即表示这些文件已被删除
{FILE *fp = NULL;char tmpbuff[4096] = {0};char *pret = NULL;fp = fopen(RECORD_PATH, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){pret = fgets(tmpbuff, sizeof(tmpbuff), fp);if (NULL == pret){break;}tmpbuff[strlen(tmpbuff)-1] = '\0';if (access(tmpbuff, F_OK) != 0){printf("%s\n", tmpbuff);}}fclose(fp);return 0;
}int IsNewFile(char *pfilepath)//判断指定的文件路径是否在record.bk中存在。如果存在,则返回0,表示不是新文件;如果不存在,则返回1,表示是新文件
{FILE *fp = NULL;char tmpbuff[4096] = {0};char *pret = NULL;fp = fopen(RECORD_PATH, "r");if (NULL == fp){perror("fail to fopen");return -1;}while (1){pret = fgets(tmpbuff, sizeof(tmpbuff), fp);if (NULL == pret){break;}tmpbuff[strlen(tmpbuff)-1] = '\0';if (0 == strcmp(tmpbuff, pfilepath)){fclose(fp);return 0;}}fclose(fp);return 1;
}int ListDir2(const char *pdirname)//用于遍历指定目录下的所有文件和子目录,并判断每个文件路径是否为新文件(调用IsNewFile函数)。如果是新文件,则打印该文件路径。
{DIR *dp = NULL;struct dirent *pp = NULL;char tmpbuff[1024] = {0};dp = opendir(pdirname);if (NULL == dp){perror("fail to opendir");return -1;}while (1){pp = readdir(dp);if (NULL == pp){break;}if ('.' == pp->d_name[0]){continue;}sprintf(tmpbuff, "%s/%s", pdirname, pp->d_name);if (IsNewFile(tmpbuff)){printf("%s\n", tmpbuff);}if (DT_DIR == pp->d_type){ListDir2(tmpbuff);}}closedir(dp);return 0;
}int ShowNewFiles(const char *pdirname)//调用ListDir2函数遍历指定目录,然后打印所有新文件的路径
{ListDir2(pdirname);return 0;
}int main(void)//首先检查是否存在record.bk文件,如果存在,则调用ShowDeleteFiles函数打印已删除的文件路径,然后调用ShowNewFiles函数打印新增的文件路径。如果record.bk文件不存在,则调用ListDirToRecord函数生成该文件
{int ret = 0;ret = access(RECORD_PATH, F_OK);if (0 == ret){printf("删除的文件:\n");ShowDeleteFiles();	printf("新增的文件:\n");ShowNewFiles(".");}else {ListDirToRecord(".");}return 0;
}

  一、时间获取

1.time 


      time_t time(time_t *tloc);
      功能:
        返回1970-1-1到现在的秒数(格林威治时间)
      参数:
        tloc:存放秒数空间首地址
      返回值:
        成功返回秒数
        失败返回-1 

 2.localtime


      struct tm *localtime(const time_t *timep);
      功能:
        将秒数转换为本地时间
      参数:
        timep:存放秒数空间首地址
      返回值:
        成功返回结构体时间
        失败返回NULL

        struct tm {
            int tm_sec;    /* Seconds (0-60) */
            int tm_min;    /* Minutes (0-59) */
            int tm_hour;   /* Hours (0-23) */
            int tm_mday;   /* Day of the month (1-31) */
            int tm_mon;    /* Month (0-11) */
            int tm_year;   /* Year - 1900 */
            int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
            int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
            int tm_isdst;  /* Daylight saving time */
        };

    3.mktime


      time_t mktime(struct tm *tm);
      功能:
        将本地时间转换为秒数

获取前一天的日期和时间

#include "head.h"int main(void)
{	time_t t;struct tm *ptm = NULL;struct tm tmp;tmp.tm_year = 2024-1900;tmp.tm_mon = 2-1;tmp.tm_mday = 20;tmp.tm_hour = 11;tmp.tm_min = 22;tmp.tm_sec = 30;t = mktime(&tmp);t -= 86400; //。通过 t -= 86400 对时间值进行减去一天的秒数的操作。//	time(&t);ptm = localtime(&t);printf("%04d-%02d-%02d %02d:%02d:%02d\n", ptm->tm_year+1900, ptm->tm_mon+1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec);return 0;
}

二、文件属性和权限的获取:

1.stat


      int stat(const char *pathname, struct stat *statbuf);
      功能:
        将pathname对应的文件信息放入statbuf中
      参数:
        pathname:文件路径字符串的首地址
        statbuf:存放文件信息空间的首地址
      返回值:
        成功返回0 
        失败返回-1 

    struct stat {
        dev_t     st_dev;         /* ID of device containing file */
        ino_t     st_ino;         /* Inode number */
        mode_t    st_mode;        /* File type and mode */
        nlink_t   st_nlink;       /* Number of hard links */
        uid_t     st_uid;         /* User ID of owner */
        gid_t     st_gid;         /* Group ID of owner */
        dev_t     st_rdev;        /* Device ID (if special file) */
        off_t     st_size;        /* Total size, in bytes */
        blksize_t st_blksize;     /* Block size for filesystem I/O */
        blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

        /* Since Linux 2.6, the kernel supports nanosecond
            precision for the following timestamp fields.
            For the details before Linux 2.6, see NOTES. */

        struct timespec st_atim;  /* Time of last access */
        struct timespec st_mtim;  /* Time of last modification */
        struct timespec st_ctim;  /* Time of last status change */

    #define st_atime st_atim.tv_sec      /* Backward compatibility */
    #define st_mtime st_mtim.tv_sec
    #define st_ctime st_ctim.tv_sec
    };

    /etc/passwd   口令文件
    /etc/group    组信息文件

    2.getpwuid 


      struct passwd *getpwuid(uid_t uid);
      功能:
        通过UID获得对应的用户信息
      参数:
        uid:用户的ID号
      返回值:
        成功返回包含用户信息的结构体
        失败返回NULL

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

    3.getgrgid


      struct group *getgrgid(gid_t gid);
      功能:
        通过组ID获得组信息
      参数:
        gid:组的ID号
      返回值:
        成功返回包含组信息的结构体
        失败返回NULL
    
    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 */
    };

    4.readlink


      ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);
      功能:
        读取连接文件本身的内容
      参数:
        pathname:链接文件的路径
        buf:存放数据空间首地址
        bufsiz:最大存放数据字节数
      返回值:
        成功返回读到字节个数
        失败返回-1 

获取给定文件的详细信息,并以类似 ls -l 命令的格式进行输出

#include "head.h"int main(int argc, const char *argv[])
{struct stat buf;int ret = 0;struct passwd *pwd = NULL;struct group *grp = NULL;struct tm *ptm = NULL;char *mon[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};char tmpbuff[1024] = {0};if (argc != 2){fprintf(stderr, "Usage:./a.out filename\n");return -1;}ret = lstat(argv[1], &buf);if (-1 == ret){perror("fail to stat");return -1;}#if 0switch (buf.st_mode & S_IFMT){case S_IFDIR:putchar('d');break;case S_IFREG:putchar('-');break;case S_IFSOCK:putchar('s');break;case S_IFLNK:putchar('l');break;case S_IFBLK:putchar('b');break;case S_IFCHR:putchar('c');break;case S_IFIFO:putchar('p');break;}
#endifif (S_ISREG(buf.st_mode)){putchar('-');}else if (S_ISDIR(buf.st_mode)){putchar('d');	}else if (S_ISCHR(buf.st_mode)){putchar('c');}else if (S_ISBLK(buf.st_mode)){putchar('b');}else if (S_ISLNK(buf.st_mode)){putchar('l');}else if (S_ISSOCK(buf.st_mode)){putchar('s');}else if (S_ISFIFO(buf.st_mode)){putchar('p');}buf.st_mode & S_IRUSR ? putchar('r') : putchar('-');buf.st_mode & S_IWUSR ? putchar('w') : putchar('-');buf.st_mode & S_IXUSR ? putchar('x') : putchar('-');buf.st_mode & S_IRGRP ? putchar('r') : putchar('-');buf.st_mode & S_IWGRP ? putchar('w') : putchar('-');buf.st_mode & S_IXGRP ? putchar('x') : putchar('-');buf.st_mode & S_IROTH ? putchar('r') : putchar('-');buf.st_mode & S_IWOTH ? putchar('w') : putchar('-');buf.st_mode & S_IXOTH ? putchar('x') : putchar('-');printf(" %ld", buf.st_nlink);pwd = getpwuid(buf.st_uid);if (NULL == pwd){printf(" %d", buf.st_uid);}else {printf(" %s", pwd->pw_name);}grp = getgrgid(buf.st_gid);if (NULL == grp){printf(" %d", buf.st_gid);}else {printf(" %s", grp->gr_name);}printf(" %ld", buf.st_size);ptm = localtime(&buf.st_mtime);printf(" %s %d %d:%d", mon[ptm->tm_mon], ptm->tm_mday, ptm->tm_hour, ptm->tm_min);printf(" %s", argv[1]);if (S_ISLNK(buf.st_mode)){readlink(argv[1], tmpbuff, sizeof(tmpbuff));printf(" -> %s", tmpbuff);}putchar('\n');return 0;
}


三、软连接和硬链接:


    1.软连接(符号链接)


        通过文件名链接,所有能够看到的连接文件均为软连接文件

        ln -s file.txt a.txt 

软链接(符号链接):

  • 软链接是通过文件名链接,创建一个指向目标文件的链接。
  • 软链接文件本身只包含目标文件的路径名,而不是目标文件的实际数据。
  • 所有能够看到的连接文件都是软链接。
  • 当删除原始文件时,软链接仍然存在,但指向的目标文件将不再可用。
  • 创建软链接使用 ln -s 命令,例如:ln -s file.txt a.txt

    2.硬链接


        通过文件对应的inode节点链接     

        ln file.txt b.txt 

硬链接:

  • 硬链接是通过文件对应的 inode 节点链接,为同一个文件分配多个文件名。
  • 硬链接文件和原始文件具有相同的 inode 节点和相同的索引节点号。
  • 修改任何一个硬链接文件(如更改文件的内容),都会影响到其他硬链接文件。
  • 可以通过不同的文件名访问同一个文件的内容。
  • 当删除一个硬链接文件时,原始文件和其他硬链接文件仍然存在。
  • 创建硬链接使用 ln 命令,例如:ln file.txt b.txt

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

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

相关文章

多人协作记账账本小程序开源版开发

多人协作记账账本小程序开源版开发 支持多人协作的记账本小程序&#xff0c;可用于家庭&#xff0c;团队&#xff0c;组织以及个人的日常收支情况记录&#xff0c;支持周月年度统计 便捷记账 便捷的记账方式&#xff0c;支持多种记账类型&#xff0c;快捷切换账本等 多账本 支…

发布订阅模式:观察者模式的一种变体

发布-订阅模型&#xff08;Publish-Subscribe Model&#xff09;的底层机制通常基于观察者模式。 发布-订阅模型是观察者模式的一种变体。 在观察者模式中&#xff0c;主题&#xff08;或被观察者&#xff09;维护了一组观察者&#xff0c;当主题的状态发生变化时&#xff0c…

TypeScript 学习笔记

主要内容参考菜鸟教程&#xff0c;结合了自己学习过程中的一些拓展 TypeScript 基础语法 | 菜鸟教程 1.1 环境配置 1.1.1 安装ts npm install -g typescript 1.2.1 编写demo var message:string "Hello World" console.log(message) 1.3.1 运行 1.3.1.1 命令行…

刘雯井柏然植物园漫步,情侣裙超养眼,甜蜜穿搭亮了。

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 刘雯井柏然漫步永州植物园&#xff0c;情侣裙惊艳亮相&#x…

稀疏计算、彩票假说、MoE、SparseGPT

稀疏计算可能是未来10年内最有潜力的深度学习方向之一&#xff0c;稀疏计算模拟了对人脑的观察&#xff0c;人脑在处理信息的时候只有少数神经元在活动&#xff0c;多数神经元是不工作的。而稀疏计算的基本思想是&#xff1a;在计算过程中&#xff0c;将一些不重要的参数设置为…

306_C++_QT_创建多个tag页面,使用QMdiArea容器控件,每个页面都是一个新的表格[或者其他]页面

程序目的是可以打开多个styles文件(int后缀文件),且是tag样式的(就是可以切多个页面出来,并且能够单独关闭);其中读取ini文件,将其插入到表格中的操作,也是比较复杂的,因为需要保持RGB字符串和前面的说明字符串对齐 ini文件举例: [MainMenu] Foreground\Selected=&…

计算机网络Day1--计算机网络体系

1.三网合一 电信网络、广播电视网络、计算机网络&#xff08;最基础最重要发展最快&#xff09; 2.Internet 名为国际互联网、因特网&#xff0c;指当前全球最大的、开放的、由众多网络相互连接而成的特定互连网&#xff0c;采用TCP/IP 协议族作为通信的规则&#xff0c;前…

【Flink】FlinkSQL读取hive数据(批量)

一、简介: Hive在整个数仓中扮演了非常重要的一环,我们可以使用FlinkSQL实现对hive数据的读取,方便后续的操作,本次例子为Flink1.13.6版本 二、依赖jar包准备: 官网地址如下: Overview | Apache Flink 1、我们需要准备相关的jar包到Flink安装目录的lib目录下,我们需…

【ArcGIS微课1000例】0105:三维模型转体模型(导入sketchup转多面体为例)

文章目录 一、实验概述二、三维模型转多面体三、加载多面体数据四、注意事项一、实验概述 ArcGIS可以借助【导入3D文件】工具支持主流的三维模型导入。支持 3D Studio Max (.3ds)、VRML and GeoVRML 2.0 (.wrl)、SketchUp 6.0 (.skp)、OpenFlight 15.8 (.flt)、Collaborative …

通俗易懂理解CA(Coordinate Attention)

一、参考资料 github代码&#xff1a;CoordAttention Coordinate Attention 二、相关介绍 通道注意力与空间注意力 关于通道注意力和空间注意力的详细介绍&#xff0c;请参考另一篇博客&#xff1a;通俗易懂理解通道注意力机制(CAM)与空间注意力机制(SAM) 注意力机制是用…

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测

分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测 目录 分类预测 | Matlab实现KPCA-ISSA-LSSVM基于核主成分分析和改进的麻雀搜索算法优化最小二乘支持向量机故障诊断分类预测分类效果基本描述程序设计参考资…

桥接模式:解耦抽象与实现,实现灵活多变的扩展结构

文章目录 一、引言二、应用场景与技术背景三、模式定义与实现四、实例详解五、优缺点分析总结&#xff1a; 一、引言 ​ 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与它的实现部分分离&#xff0c;使它们可以独立变化。这种模式通过创建一个抽象层和实现层的结构&…

TiDB离线部署、Tiup部署TiDB

先做tidb准备工作&#xff1a; 部署 TiDB 前的环境检查操作&#xff1a;TiDB 环境与系统配置检查 | PingCAP 文档中心 1.查看数据盘 fdisk -l &#xff08;2,3&#xff09;本人的分区已经是 ext4 文件系统不用分区&#xff0c;具体官方文档的分区&#xff1a; 4.查看数据盘…

C#_扩展方法

简述&#xff1a; 扩展方法所属类必需是静态类&#xff08;类名依据规范通常为XXXExtension&#xff0c;XXX为被扩展类&#xff09;扩展方法必需是公有的静态方法扩展方法的首个参数由this修饰&#xff0c;参数类型为被扩展类型 示例&#xff1a; static class DoubleExtens…

IDEA 2023.2 配置 JavaWeb 工程

目录 1 不使用 Maven 创建 JavaWeb 工程 1.1 新建一个工程 1.2 配置 Tomcat 1.3 配置模块 Web 2 使用 Maven 配置 JavaWeb 工程 2.1 新建一个 Maven 工程 2.2 配置 Tomcat &#x1f4a5;提示&#xff1a;IDEA 只有专业版才能配置 JavaWeb 工程&#xff0c;若是社区版&am…

Bert基础(二)--多头注意力

多头注意力 顾名思义&#xff0c;多头注意力是指我们可以使用多个注意力头&#xff0c;而不是只用一个。也就是说&#xff0c;我们可以应用在上篇中学习的计算注意力矩阵Z的方法&#xff0c;来求得多个注意力矩阵。让我们通过一个例子来理解多头注意力层的作用。以All is well…

【深蓝学院】移动机器人运动规划--第6章 模型预测控制(MPC)与运动规划--笔记

0. Outline 1. Reactive Control&#xff08;反应式控制&#xff09; 控制学中的 “Reactive Control” 通常指的是一种控制策略&#xff0c;它依赖于系统对特定事件或变化的即时反应&#xff0c;而不是按照预定的计划或策略行动。这种控制往往是基于当前的传感器输入来做出决…

神经网络基础——激活函数的选择、参数初始化

一、神经网络 1、神经网络 人工神经网络&#xff08;Artificial Neural Network&#xff0c;即ANN&#xff09;也简称为神经网络&#xff08;NN&#xff09;是一种模仿生物神经网络结构 和功能的计算模型。 2、基本部分 输入层&#xff1a;输入 x 输出层&#xff1a;输出 y 隐…

华清远见作业第四十二天——Qt(第四天)

思维导图&#xff1a; 编程&#xff1a; 代码&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTextToSpeech> //语音播报类 QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public Q…

Rust核心:【所有权】相关知识点

rust在内存资源管理上采用了&#xff08;先进优秀&#xff1f;算吗&#xff09;但特立独行的设计思路&#xff1a;所有权。这是rust的核心&#xff0c;贯穿在整个rust语言的方方面面&#xff0c;并以此为基点来重新思考和重构软件开发体系。 涉及到的概念点&#xff1a;借用&am…