Linux下的系统编程——文件与目录操作(六)

news2024/12/23 4:15:58

前言:

在Linux系统中,文件和目录的操作非常灵活。用户可以通过命令行或者图形界面来进行操作。下面是Linux文件和目录操作的一些常见操作:

一、文件系统

1.inode

        其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置……也叫作文件属性管理结构,大多数的inode,都存储在磁盘上。
        少量常用、近期使用的inode会被缓存到内存中。,

2.dentry 

        目录项,其本质依然是结构体,重要成员变量有两个{文件名,inode,...},而文件内容(data)保存在磁盘盘块中。

 二、文件操作

1.stat/lstat:

stat/lstat 函数:

    int stat(const char *path, struct stat *buf);

    参数:
        path: 文件路径

        buf:(传出参数) 存放文件属性。

    返回值:

        成功: 0

        失败: -1 errno

    获取文件大小: buf.st_size


#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{

	struct stat sbuf;

	int ret = stat(argv[1],&sbuf);
	if(ret == -1){
		perror("stat error");
		exit(1);
	}
	printf("file size:%ld\n",sbuf.st_size);

	return 0;
}

  获取文件类型: buf.st_mode

#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{

	struct stat sb;

	int ret = stat(argv[1],&sb);
	if(ret == -1){
		perror("stat error");
		exit(1);
	}
	
	//printf("file size:%ld\n",sbuf.st_size);
	
	if(S_ISREG(sb.st_mode)){
		printf("It is a regular\n");
	}else if(S_ISDIR(sb.st_mode)){
		printf("It is a dir\n");
	}else if(S_ISFIFO(sb.st_mode)){
		printf("It is a pipe\n");
	}else if(S_ISLNK(sb.st_mode)){
		printf("It is a sym link\n");
	}
	
	return 0;
}

    获取文件权限: buf.st_mode

    符号穿透:stat会。lstat不会。

#include<stdio.h>
#include<sys/stat.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{

	struct stat sb;

	int ret = lstat(argv[1],&sb);
	if(ret == -1){
		perror("stat error");
		exit(1);
	}
	
	//printf("file size:%ld\n",sbuf.st_size);
	
	if(S_ISREG(sb.st_mode)){
		printf("It is a regular\n");
	}else if(S_ISDIR(sb.st_mode)){
		printf("It is a dir\n");
	}else if(S_ISFIFO(sb.st_mode)){
		printf("It is a pipe\n");
	}else if(S_ISLNK(sb.st_mode)){
		printf("It is a sym link\n");
	}
	
	return 0;
}

 

文件权限位图:

2.link/unlink:

link 函数,可以为已经存在的文件创建目录项(硬链接)

mv命令既是修改了目录项,而并不修改文件本身。↓
 

unlink:删除一个目录的文件项

#include<stdio.h>
#include <unistd.h>


int main(int argc,char *argv[])
{

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

	unlink(argv[1]);
	
	return 0;
}

  3.隐式回收。

        当进程结束运行时,所有该进程打开的文件会被关闭,申请的内存空间会被释放。系统的这一特性称之为隐式回收系统资源。

4.readlink 

读取符号链接文件本身内容,得到链接所指向的文件名。
ssiz...t readlink(const char*path, char*buf, size_t bufsiz);

        成功:返回实际读到的字节数;

        失败:-1设置errno为相应值。

5.rename


重命名一个文件。
int rename(const char*oldpath, const char*newpath);

        成功: 0;

        失败: -1设置errno.为相应值。

和实现前面的myMv效果相同

三、目录操作

1.文件目录权限

注意:

        目录文件也是“文件”。其文件内容是该目录下所有子文件的目录项dentry。可以尝试用vim打开一个目录。

目录设置黏住位:

        若有w权限,创建不变,删除、修改只能由root、目录所有者、文件所有者操作。

用vi查看目录:  vi  目录        查看到的是:目录项

 2.目录操作函数:

(1)opendir:

        根据传入的目录名打开一个目录(库函数)

        语法:DIR *opendir(const char *name);

        成功返回指向该目录结构体指针

        失败返回NULL

(2)closedir:

        关闭打开目录

        语法:int closedir(DIR*dirp); 

        成功:0;

        失败: -1设置errno为相应值。

(3)readdir:

        读取目录(库函数)

        语法:struct dirent*readdir(DIR*dirp);

        成功返回目录项结构体指针;

        失败返回NULL设置errno为相应值

需注意返回值,读取数据结束时也返回NULL值,所以应借助errno.进
步加以区分

 


	struct dirent *readdir(DIR * dp);

		struct dirent {

			inode
			char dname[256];

		};

(4)rewinddir

        回卷目录读写位置至起始。,
        语法:void rewinddir(DIR*dirp);返回值:无。

(5)telldir/seekdir 

        获取目录读写位置,
        语法:long telldir(DlR *dirp);

        成功:与dirn.相关的目录当前读写位置。

        失败-1,设置errno.

        修改目录读写位置
        void seekdir(DIR*dirp, long loc);

        返回值:无,

        参数loc一般由telldir函数的返回值来决定。

#include<stdio.h>
#include<dirent.h>
#include<stdlib.h>

int main(int argc,char *argv[])
{
	DIR * dp;
	struct dirent *sdp;

	dp = opendir(argv[1]);
	if(dp == NULL){
		perror("opendir error");
		exit(1);
	}
	while((sdp = readdir(dp)) != NULL){
		printf("%s\n",sdp->d_name);
	}
	printf("\n");

	closedir(dp);

	return 0;
}

 3.递归遍历目录

查询指定目录,递归列出目录中文件,同时显示文件大小

递归遍历目录:ls-R.c

    1. 判断命令行参数,获取用户要查询的目录名。    int argc, char *argv[1]

        argc == 1  --> ./

    2. 判断用户指定的是否是目录。 stat  S_ISDIR(); --> 封装函数 isFile() {   }

    3. 读目录:

 read_dir() { 

        opendir(dir)

        while (readdir()){

            普通文件,直接打印

            目录:
                拼接目录访问绝对路径。sprintf(path, "%s/%s", dir, d_name) 

                递归调用自己。--》 opendir(path) readdir closedir
        }

        closedir()

 }
 read_dir() --> isFile() ---> read_dir()

代码预览:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pthread.h>

void isFile(char *name);

// 打开目录读取,处理目录
void read_dir(char *dir, void (*func)(char *))
{
    char path[259];
    DIR *dp;
    struct dirent *sdp;

    dp = opendir(dir);
    if (dp == NULL) {
        perror("opendir error");
        return;
    }
    // 读取目录项
    while((sdp = readdir(dp)) != NULL) {
        if (strcmp(sdp->d_name, ".") == 0 || strcmp(sdp->d_name, "..") == 0) {
            continue;
        }
        //fprintf();
        // 目录项本身不可访问, 拼接. 目录/目录项
        sprintf(path, "%s/%s", dir, sdp->d_name);

        // 判断文件类型,目录递归进入,文件显示名字/大小
        //isFile(path);    
        (*func)(path);
    }

    closedir(dp);

    return ;
}

void isFile(char *name)

    int ret = 0;
    struct stat sb;

    // 获取文件属性, 判断文件类型
    ret = stat(name, &sb);
    if (ret == -1) {
        perror("stat error");
        return ;
    }
    // 是目录文件
    if (S_ISDIR(sb.st_mode)) {
        read_dir(name, isFile);
    }
    // 是普通文件, 显示名字/大小
    printf("%10s\t\t%ld\n", name, sb.st_size);

    return;
}


int main(int argc, char *argv[])
{
    // 判断命令行参数
    if (argc == 1) {
        isFile(".");
    } else {
        isFile(argv[1]);
    }

	return 0;
}

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

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

相关文章

抖音电商,提前批offer!

南京夫子庙茶颜悦色店 摄于2023.8.27 小伙伴们大家好&#xff0c;我是阿秀。 互联网圈有个梗就是"两大码农工厂&#xff1a;南华科、北北邮"&#xff0c;就是说这两所高校的毕业生从事互联网工作的特别多&#xff0c;北邮虽然是211&#xff0c;但在互联网圈子里比很多…

5分钟看懂物料清单(BOM)的用途、类型及管理

管理物料可以提高制造和供应链流程的效率&#xff0c;例如生产、物流、调度、产品成本核算和库存计划。企业通常使用物料清单作为制造产品的组件、材料和流程的中央记录。 物料清单&#xff08;BOM&#xff09;是构建、制造或维修产品或服务所需的原材料、组件和说明的详细列表…

K8S:K8S自动化运维容器Docker集群

文章目录 一.k8s概述1.k8s是什么2.为什么要用K8S3.作用及功能4.k8s容器集群管理系统 二.K8S的特性1.弹性伸缩2.自我修复3.服务发现和复制均衡4.自动发布和回滚5.集中化配置管理和秘钥管理6.存储编排7.任务批量处理运行 三.K8S的集群架构四.K8S的核心组件1.Master组件&#xff0…

水土保持技术教程

详情点击公众号链接&#xff1a;新《生产建设项目水土保持方案技术审查要点》要求下全流程水土保持实践技术应用教程 目标 1、水土保持常用的主要法律法规、部委规章、规范性文件及技术规范与标准&#xff1b; 2、水土保持方案、监测及验收工作开展的流程&#xff1b; 3、水…

同一台电脑测.Net和Mono平台浮点运算的差异

float speed 0.1f;float distance 2.0f;long needTime (long)(distance / speed);Log.Debug($"needTime{needTime}"); 结果&#xff1a; .Net平台算出20 Mono平台算出19

尚硅谷SpringMVC (5-8)

五、域对象共享数据 1、使用ServletAPI向request域对象共享数据 首页&#xff1a; Controller public class TestController {RequestMapping("/")public String index(){return "index";} } <!DOCTYPE html> <html lang"en" xmln…

桌面网络存储迎来新浪潮!龙蜥社区联合龙芯首发优龙桌面网络存储一体机方案

2023 年 8 月 19 日&#xff0c;龙蜥社区合作伙伴单位南京龙众创芯电子科技有限公司(以下简称“龙众创芯“)与龙蜥社区理事单位龙芯中科(武汉)技术有限公司&#xff08;以下简称“龙芯”&#xff09;&#xff0c;联合可道云、上海七朵信息等多家生态伙伴&#xff0c;以及龙芯开…

IntelliJ IDEA快捷键大全 + 动图演示,建议收藏!

本文参考了 IntelliJ IDEA 的官网&#xff0c;列举了IntelliJ IDEA&#xff08;Windows 版&#xff09;的所有快捷键。并在此基础上&#xff0c;为 90% 以上的快捷键提供了动图演示&#xff0c;能够直观的看到操作效果。 该快捷键共分 16 种&#xff0c;可以方便的按各类查找自…

【二维偏序】CF Edu10 D

Problem - D - Codeforces 题意&#xff1a; 思路&#xff1a; Code&#xff1a; #include <bits/stdc.h>#define int long long #define lowbit(x) (x & (-x))using i64 long long;constexpr int N 2e6 10; constexpr int M 2e6 10; constexpr int P 2e6; c…

美国纽扣电池/锂电池产品UL4200A标准解析

近来&#xff0c;部分ANSI/UL标准&#xff08;如UL1082、UL982、UL1026、UL1081等&#xff09;对含有纽扣锂电池的产品新增了UL4200A的要求。对于具体生效日期&#xff0c;请注意后续各终端产品标准新版本更新通告。 1. 适用产品 安装有直径 ≤32mm&#xff0c;且直径大于高度的…

如何在不重新安装的情况下将操作系统迁移到新硬盘?

通常情况下&#xff0c;当你的硬盘损坏或文件过多时&#xff0c;电脑会变得缓慢且卡顿。这时&#xff0c;你可能会被建议更换为一块更好的新硬盘。 ​ 在比较HDD和SSD之后&#xff0c;许多用户更愿意选择SSD作为他们的新硬盘&#xff0c;因为SSD比HDD更稳定且运行更安…

平面设计师都在用的6个免费素材网站

常见的设计素材网站太多了&#xff0c;不是要会员就是要花钱买&#xff0c;今天给大家推荐几个可以免费下载的设计素材网站&#xff0c;有需要的朋友赶紧马住了。 1、菜鸟图库 菜鸟图库-免费设计素材下载菜鸟图库汇集了各种免费高清广告图片设计、电商淘宝、企业办公模板、视频…

python爬取bilibili,下载视频

一. 内容简介 python爬取bilibili&#xff0c;下载视频 二. 软件环境 2.1vsCode 2.2Anaconda version: conda 22.9.0 2.3代码 链接&#xff1a;https://pan.baidu.com/s/1WuXTso_iltLlnrLffi1kYQ?pwd1234 三.主要流程 3.1 下载单个视频 代码 import requests impor…

Springboot快速搭建Web API项目

内容概述 SpringBoot最常见得用途就是web api项目。 本文介绍使用自动配置功能&#xff0c;通过最简洁的pom依赖&#xff0c;快速搭建一个示例项目。 实现的功能为&#xff1a;接收http请求并返回json格式的数据。 一、配置pom.xml依赖 1.引入springweb依赖 <dependenc…

小米手机便签怎么导出到华为mate60Pro手机上?

华为mate60Pro手机于2023年8月29日发布了先锋计划&#xff0c;有不少网友都抢到了这款新机。而有一些网友表示自己在换手机之前遇到了问题&#xff0c;这就是之前使用的手机是小米&#xff0c;所以需要把重要的图片、短信、通讯录、便签等数据导出到新的手机上&#xff0c;但是…

【算法日志】动态规划刷题:股票买卖问题(day41)

代码随想录刷题60Day 目录 前言 买卖股票的最佳时机1 买卖股票的最佳时机2 买卖股票的最佳时机3 买卖股票的最佳时机4 前言 本日着重于多状态问题的处理&#xff0c;各状态之间会有一定联系&#xff0c;状态转移方程将不再局限一个。 买卖股票的最佳时机1 int maxProfit(…

基于Vue前端框架构建BI应用程序

一、什么是Vue&#xff1f; Vue&#xff08;Vue.js&#xff09;是一个轻量级、高性能、可组件化的MVVM库。简而言之&#xff0c;是一个构建数据驱动的web界面的渐进式框架。它采用MVVM思想&#xff0c;通过数据双向绑定实现数据的动态渲染&#xff0c;同时也支持组件化的开发方…

Ansible学习笔记15

1、roles&#xff1a;&#xff08;难点&#xff09; roles介绍&#xff1a; roles&#xff08;角色&#xff09;&#xff1a;就是通过分别将variables&#xff0c;tasks及handlers等放置于单独的目录中&#xff0c;并可以便捷地调用他们的一种机制。 假设我们要写一个playbo…

RuntimeError: scatter_cpu_(): Expected self.dtype to be equal to src.dtype

1. 问题描述 如下图&#xff0c;输入scatter_时报错&#xff01; 2. 报错原因 查阅资料发现是因为要填充的value与要被填充的tensor类型不同&#xff01;如下图 3. 解决办法 将其转换成一样的类型即可&#xff0c;如下图&#xff0c;测试没有报错&#xff1a;

RecyclerView回收复用分析

作者&#xff1a;Calculus_小王 本文从ViewTraversals三大流程和事件分发讲起&#xff0c;结合使用和体验&#xff0c;重点剖析RecyclerView的回收复用机制。全篇将以LinearLayoutManager为例&#xff0c;围绕RecyclerView.Adapter日常重写的几个经典方法展开&#xff0c;讲清R…