系统编程-文件属性和目录操作

news2024/11/18 21:32:28

4 文件属性和目录操作

一、目录操作

-- 目录操作主要的目的:让程序知道路径下有什么文件存在

-- 注:程序在哪里运行他的工作路径就在哪里 ,程序中所有的相对路径的文件就是基于工作路径来实现的

alt text

1、获取当前程序运行的工作路径

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • char *getcwd(char *buf, size_t size);

-- 函数的作用:

  • 获取程序运行所在的工作路径

-- 函数的参数:

  • buf:用来存放获取到的工作路径的字符串的地址
  • size:前面一个指针指向数组的大小

-- 函数的返回值:

  • 成功返回 一个字符串的首地址 这个字符串为程序的工作路径
  • 失败返回 NULL
#include <unistd.h>
#include <stdio.h>



char *getcwd(char *buf, size_t size);

int main()
{
    //第一种:通过返回值
    char *p = getcwd(NULL,0);
    printf("%s\n",p);
    if(p == NULL)
    {
        perror("getcwd");
    }
    /*
    //第二种,通过参数
    char buf[1024];
    getcwd(buf,1024);
    printf("%s\n",buf);
    */
}

注;有两种方法获取路径

alt text

2、更改程序的工作路径

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • int chdir(const char *path);

-- 函数的作用:

  • 更改程序的工作路径

-- 函数的参数:

  • path:要进行跳转的工作路径

-- 函数返回值:

  • 成功 0
  • 失败 -1
#include <unistd.h>

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int d = chdir(argv[1]);
    if(d == -1)
    {
        perror("chdir");
    }
    char *p = getcwd(NULL,0);
    printf("%s\n",p);
    return 0;
}

alt text


-- 下面是重点

  • 目录操作类似于文件操作
  • 按照下面的步骤即可实现目录操作
  • 主要目的 可以获取目录下的文件名

3、打开目录流

-- 函数头文件

  • #include <sys/types.h>
  • #include <dirent.h>

-- 函数原型

  • DIR *opendir(const char *name);

-- 函数的作用:

  • 打开指定的目录并获取目录流指针

-- 函数的参数:

  • name:填写要进行打开的目录路径

-- 函数的返回值:

  • 成功返回 目录流指针
  • 失败返回 NULL
#include <sys/types.h>
#include <dirent.h>

#include <stdio.h>

int main(int argc, char const *argv[])
{
    DIR * p = opendir(argv[1]);
    if(p == NULL)
    {
        perror("opendir");
    }
    printf("打开%s目录成功!\n",argv[1]);
    return 0;
}

2、从目录流中读取出来一个文件

-- 函数头文件

  • #include <dirent.h>

-- 函数原型

  • struct dirent *readdir(DIR *dirp);

-- 函数的作用:

  • 从目录流中读取出来一个文件

-- 函数的参数:

  • DIR *dirp:opendir 的返回值 打开的目录流指针

-- 函数的返回值:

  • 成功返回 读取到的文件
  • 失败返回 NULL 读取到目录尾也返回 NULL

alt text

tip:节点号 “ls -i”可以看到

alt text

alt text

3、关闭目录流指针

-- 函数头文件

  • #include <sys/types.h>
  • #include <dirent.h>

-- 函数原型

  • int closedir(DIR *dirp);

-- 函数的作用

  • 关闭打开过的目录流指针

-- 函数的参数

  • DIR *dirp:opendir 的返回值 目录流指针

-- 函数的返回值:

  • 成功 0
  • 失败 -1

4、通过函数创建出来一个文件夹

-- 函数头文件

  • #include <sys/stat.h>
  • #include <sys/types.h>

-- 函数原型

  • int mkdir(const char *pathname, mode_t mode);

-- 函数的作用:

  • 通过函数来创建出来一个文件夹

-- 函数的参数:

  • pathname:要进行创建的文件名和路径
  • mode:创建出来的文件夹权限 0777

-- 函数的返回值:

  • 成功 0
  • 失败 -1
#include <sys/stat.h>
#include <sys/types.h>

#include <stdio.h>


int main(int argc, char const *argv[])
{
    int d = mkdir(argv[1], 0777);
    if(d == -1)
    {
        perror("mkdir");
    }
    return 0;
}

4、删除空文件夹

-- 函数头文件

  • #include <unistd.h>

-- 函数原型

  • int rmdir(const char *pathname);

-- 函数原型

  • 删除一个空文件夹

-- 函数的参数

  • pathname:要进行删除的文件夹名称

-- 函数的返回值:

  • 成功 0
  • 失败 -1

注:只能删除空文件!!!

4、修改文件的权限

-- 函数头文件

  • #include <sys/stat.h>

-- 函数原型 int chmod(const char *pathname, mode_t mode);

-- 函数的作用

  • 修改文件的权限

-- 函数的参数

  • pathname:要进行修改的文件名
  • mode:权限

-- 函数的返回值:

  • 成功 0
  • 失败 -1

二、文件属性

-- 可以获取文件的详细信息

  • 例如:文件的类型 文件的权限 文件的硬链接数 文件的大小 文件的创建时间 文件的修改时间 文件的最后操作时间

stat

-- 函数头文件

  • #include <sys/types.h>
  • #include <sys/stat.h>
  • #include <unistd.h>

-- 函数原型

  • int stat(const char *pathname, struct stat *statbuf);

-- 函数的作用:

  • 获取文件的详细信息

-- 函数的参数:

  • pathname:要查看的文件名
  • struct stat *statbuf:填写同数据类型的地址

-- 传出参数

  • 将第一个参数的文件详细信息传出来

-- 函数的返回值:

  • 成功返回 0
  • 失败返回 -1

alt text


注:stat 函数如果去获取软链接文件的信息 实际获得的是源文件的信息


-- int lstat(const char *pathname, struct stat *statbuf);

  • 该函数可以用来获取软链接文件的详细信息

-- int fstat(int fd, struct stat *statbuf);

  • 该函数也可以获取文件的详细信息但是必须要先 通过 open 来打开文件

例1 :

仿写 find 指令 ./a.out 路径 文件名 or 后缀  -- 打印出来所有文件的绝对路径

/*
    仿写 find 指令
    ./a.out 路径 文件名 or 后缀
    打印出来所有文件的绝对路径

*/
#include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <string.h>


void find_files(const  char *a, const char *b) {  
    DIR *p = opendir(a);  
    if (p == NULL) {  
        perror("opendir");  
        return;  
    }  

    struct dirent *file;  
    char new_path[PATH_MAX]; // 存储当前文件的绝对路径  
    

    while ((file = readdir(p)) != NULL) {  
        if (strcmp(file->d_name, ".") == 0 || strcmp(file->d_name, "..") == 0) {  
            continue;  
        }  

        // 创建新的路径  
        snprintf(new_path, sizeof(new_path), "%s/%s", a, file->d_name);  
  
        if (strcmp(b, file->d_name) == 0) {  
            printf("%s\n", new_path);  
        }  

        // 如果是目录,递归搜索  
        if (file->d_type == DT_DIR) {  
            find_files(new_path, b);  
        }  
    }  

    closedir(p);  
}  

int main(int argc, char const *argv[]) {  
    if (argc < 3) {  
        printf("使用方法: %s 路径 文件名或后缀\n", argv[0]);  
        return -1;  
    }  

    find_files(argv[1], argv[2]);  

    return 0;  
}

 

例2: 

-- 实现仿写 ls -l
     -  例如: ./a.out 文件名 显示该文件的详细信息
     -  ./a.out 显示当前路径下的所有文件的详细信息
     -  ./a.out 路径 显示该路径下的所有文件的详细信息

/*
    实现仿写 ls -l
    例如: ./a.out 文件名 显示该文件的详细信息
    ./a.out 显示当前路径下的所有文件的详细信息
    ./a.out 路径 显示该路径下的所有文件的详细信息
*/
#include <sys/types.h>  
#include <sys/stat.h> 
#include <stdlib.h> 
#include <unistd.h>  
#include <stdio.h>  
#include <time.h>  
#include <dirent.h>  
#include <string.h>  
#include <pwd.h>  
#include <grp.h>  
 

void get_type(int a);
void get_rwx(int a);

int main(int argc, char const *argv[]) { 
    char *path;  
    if (argc == 1) {  
        path = getcwd(NULL, 0);  
        if (path == NULL) {  
            perror("getcwd");  
            return -1;  
        }  
    } else {  
        path = (char *)argv[1];  
    } 

    DIR *dir = opendir(path); 
    if (dir == NULL) {  
        perror("opendir");  
        return -1;  
    }  

    struct dirent *entry;  
    struct stat f; // 用于存放文件状态  

    while ((entry = readdir(dir)) != NULL) {  
        char fullPath[1024];  
        snprintf(fullPath, sizeof(fullPath), "%s/%s", path, entry->d_name); // 生成完整路径  
        if (stat(fullPath, &f) == -1) {  
            perror("stat");  
            continue; // 跳过无法访问的文件  
        }  

        get_type(f.st_mode); 
        get_rwx(f.st_mode/64%8);
        get_rwx(f.st_mode/8%8);
        get_rwx(f.st_mode%8);  
        printf("%ld\t", f.st_nlink);  
        printf("%s\t", getpwuid(f.st_uid)->pw_name);   
        printf("%s\t", getgrgid(f.st_gid)->gr_name);   
        printf("%ld\t", f.st_size);  

        char timebuf[80];  
        struct tm *tm_info = localtime(&f.st_mtime); 
        strftime(timebuf, sizeof(timebuf), "%b %d %H:%M", tm_info);  
        printf(" %s\t", timebuf); 
        printf(" %s\n", entry->d_name);   
    }  

    closedir(dir); 
    if (argc == 1) {  
        free(path);   
    }  
    return 0;  
}  


void get_type(int a)
{
    if(S_ISFIFO(a))
    printf("p");
    else if(S_ISBLK(a))
    printf("b");
    else if(S_ISCHR(a))
    printf("c");
    else if(S_ISDIR(a))
    printf("d");
    else if(S_ISLNK(a))
    printf("l");
    else if(S_ISREG(a))
    printf("-");
    else if(__S_ISTYPE((a), __S_IFSOCK))
    printf("s");
}

void get_rwx(int a)
{
    switch(a)
    {
    case 0:printf("---");break;
    case 1:printf("--x");break;
    case 2:printf("-w-");break;
    case 3:printf("-wx");break;
    case 4:printf("r--");break;
    case 5:printf("r-x");break;
    case 6:printf("rw-");break;
    case 7:printf("rwx");break;
}
}

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

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

相关文章

爬取豆瓣TOP250电影详解

一.分析网页DOM树结构 1.分析网页结构及简单爬取 豆瓣&#xff08;Douban&#xff09;是一个社区网站&#xff0c;创立于2005年3月6日。该网站以书影音起家&#xff0c;提供关于书籍、电影、音乐等作品的信息&#xff0c;其作品描述和评论都是由用户提供&#xff08;User-Gen…

MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74)

专栏往期文章,包含本章 MATLAB 手动实现一种高度覆盖值提取建筑物点云的方法(74) 一、算法介绍二、算法实现1.代码2.效果总结一、算法介绍 手动实现一种基于高度覆盖值的建筑物点云提取方法,适用于高大的城市建筑物,比只利用高度提取建筑物的方法更加稳定和具有价值,主要…

NC 丑数

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 把只包含质因…

Linux_Shell三剑客grep,awk,sed-08

三剑客的概述&#xff1a; awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找…

英伟达开源 Nemotron-4-4B:小型模型,大能量

前沿科技速递&#x1f680; 在人工智能领域&#xff0c;语言模型已经成为推动自然语言处理&#xff08;NLP&#xff09;进步的关键力量。然而&#xff0c;随着模型规模的不断扩大&#xff0c;训练和部署这些大型语言模型&#xff08;LLM&#xff09;的资源成本也在急剧增加。为…

2024年8月 trueNas 容器端口只能设置大于9000问题解决

前言 这两天在搭建个人nas&#xff0c;想顺便在局域网搭建一个dns服务器&#xff0c;我采用的是jpillora/dnsmasq的docker镜像搭建的&#xff0c;但是遇到一个问题始终无法解决容器端口必须大于9000&#xff0c;而dns使用的端口是53是改不了的&#xff0c;找了很多资料发现有老…

地图相册系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

Transformer 中自注意力机制的 一些细节理解

摘自知乎博主https://www.zhihu.com/question/362131975/answer/2182682685?utm_oi78365163782144 作者&#xff1a;月来客栈 链接&#xff1a;https://www.zhihu.com/question/362131975/answer/2182682685 1. 多头注意力机制原理 1.1 动机 首先让我们先一起来看看作者当…

IP SSL证书快速申请教程

在互联网安全领域中&#xff0c;SSL证书是比较普遍的传输数据加密方式之一。SSL证书通过建立加密通道&#xff0c;确保客户端与服务器之间传输的数据不被第三方窃取或篡改。而大多数SSL证书&#xff0c;如单域名SSL证书、多域名SSL证书以及通配符SSL证书&#xff0c;在申请时必…

颇为实用的现代化开源数据表格GristCore

GristCore&#xff1a;用Grist&#xff0c;让数据自动化&#xff0c;让工作更智能。 - 精选真开源&#xff0c;释放新价值。 概览 Grist-core项目是Grist的心脏&#xff0c;是一个创新的在线数据协作平台&#xff0c;它突破了传统电子表格的局限&#xff0c;引入了先进的自动化…

宋仕强论道之效率与成本的关系

宋仕强论道之效率与成本的关系中说&#xff0c;效率于企业的意义重大&#xff0c;一是技术发展和应用带来效率提高&#xff0c;农耕文明与工业时代分别以铁制农具应用和电气化为标志。在现阶段&#xff0c;人工智能&#xff08;AI&#xff09;是目前最有效的新技术&#xff0c;…

Linux找回root密码,帮助指令

目录 找回root密码 帮助指令 man获得帮助指令 help指令 应用实例 找回root密码 进入开机界面&#xff0c;输入e进入编辑界面。 在指定位置输入init/bin/sh 再输入ctrlx进入单用户模式。 最后输入passwd修改密码。 帮助指令 man获得帮助指令 man ls后可以看到很多指令以…

【leetcode】相交链表-25-1

方法&#xff1a;遍历 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {…

Gene_processing_system-v2.0使用之环境变量配置

Gene_processing_system-v2.0环境变量配置 在D盘路径解压上述文件《Gene_processing_system-v2.0.zip》&#xff0c;解压后&#xff0c;对内置Python3.9环境变量进行配置。操作如下&#xff1a; 环境变量配置 第一步&#xff1a;复制python3.9路径值&#xff0c;复制路径值为…

【MySQL】数据的基本操作(CRUD)

系列文章目录 例如&#xff1a;第一章 数据库基础 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、对数据简单操作新增操作 (create)查询操作(select)模糊查询分页查询修改操作(update)删除操…

C 开源库之cJSON

cJSON简介 CJSON库是一个用于解析和生成JSON数据的C语言库。 它提供了一组函数&#xff0c;使得在C语言中操作JSON数据变得简单而高效。 您可以使用CJSON库来解析从服务器返回的JSON数据&#xff0c;或者将C语言数据结构转换为JSON格式以进行传输。 cJSON 使用 官网地址&…

JAVA同城找搭子同城交友系统小程序源码

&#x1f308;【同城搭子交友系统】—— 遇见你的城市小确幸✨ &#x1f46d; 城市喧嚣中的温暖邂逅 在繁忙的都市生活中&#xff0c;你是否常常感到孤单&#xff0c;渴望有那么几个志同道合的朋友&#xff0c;一起探索这座城市的每一个角落&#xff1f;&#x1f3d9;️ 同城…

【机器学习-监督学习】逻辑斯谛回归

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…

【前端 23】用Less优化你的CSS书写体验

用Less优化你的CSS书写体验 Less&#xff08;Leaner Style Sheets&#xff09;是一种CSS预处理器&#xff0c;它扩展了CSS的功能&#xff0c;引入了变量、嵌套规则、混合&#xff08;Mixins&#xff09;、运算等特性&#xff0c;使得CSS编写更加灵活和强大。下面&#xff0c;我…

【虚拟化】KVM命令行安装linux虚拟机

目录 ​一、KVM概述 1.1 KVM是什么 1.2 KVM和QEMU的关系 1.3 kvm相关安装包及其作用 二、安装KVM 三、命令行创建虚拟机并安装CentOS7 四、报错处理 4.1 问题1 4.2 问题2 一、KVM概述 1.1 KVM是什么 KVM(Kernel-based Virtual Machine, 即内核级虚拟机) 是一个开源的系…