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

前言:

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

目录

一、文件系统

1.inode

2.dentry 

 二、文件操作

1.stat/lstat:

2.link/unlink:

  3.隐式回收。

4.readlink 

5.rename

三、目录操作

1.文件目录权限

 2.目录操作函数:

(1)opendir:

(2)closedir:

(3)readdir:

(4)rewinddir

(5)telldir/seekdir 

 3.递归遍历目录

 四、重定向:

(1)dup :

 (2)dup2:

 五、fcntl实现dup描述符


一、文件系统

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 {inodechar 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;
}

 四、重定向:

(1)dup :

  int dup(int oldfd);        文件描述符复制。

        oldfd:  已有文件描述符

        返回:新文件描述符。

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>int main(int argc,char *argv[])
{int fd = open(argv[1],O_RDONLY);012 ----3int newfd = dup(fd);	//4printf("newfd = %d\n",newfd);return 0;
}

 *(2)dup2:

 int dup2(int oldfd, int newfd); 文件描述符复制。重定向。

#include<stdio.h>
#include<unistd.h>
#include<fcntl.h>int main(int argc,char *argv[])
{int fd1 = open(argv[1],O_RDWR);int fd2 = open(argv[2],O_RDWR);int fdret = dup2(fd1,fd2);printf("fdret = %d\n",fdret);int ret = write(fd2,"-----1234567-----",7);printf("ret = %d\n",ret);dup2(fd1,STDOUT_FILENO);printf("********--------------------********\n");return 0;
}

 五、fcntl实现dup描述符

fcntl 函数实现 dup:

    int fcntl(int fd, int cmd, ....)

    cmd: F_DUPFD

    参3:  被占用的,返回最小可用的。

        未被占用的, 返回=该值的文件描述符。

#include<stdio.h>
#include<fcntl.h>int main(int argc,char *argv[])
{int fd1 = open(argv[1],O_RDWR);printf("fd1 = %d\n",fd1);int newfd = fcntl(fd1,F_DUPFD,0);//0被占用,fcntl使用文件描述符表中的最小文件描述符返回(4)printf("newfd = %d\n",newfd);int newfd2 = fcntl(fd1,F_DUPFD,7);//7 未被占用,返回>=7的文件描述符printf("newfd2 = %d\n",newfd2);return 0;}

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

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

相关文章

OpenCV:实现图像的负片

负片 负片是摄影中会经常接触到的一个词语&#xff0c;在最早的胶卷照片冲印中是指经曝光和显影加工后得到的影像。负片操作在很多图像处理软件中也叫反色&#xff0c;其明暗与原图像相反&#xff0c;其色彩则为原图像的补色。例如&#xff0c;颜色值A与颜色值B互为补色&#…

2.5 PE结构:导入表详细解析

导入表&#xff08;Import Table&#xff09;是Windows可执行文件中的一部分&#xff0c;它记录了程序所需调用的外部函数&#xff08;或API&#xff09;的名称&#xff0c;以及这些函数在哪些动态链接库&#xff08;DLL&#xff09;中可以找到。在Win32编程中我们会经常用到导…

【MySQL】MySQL 慢SQL如何避险

我们在日常开发中&#xff0c;一定遇见过某些SQL执行较慢的情况&#xff0c;我们俗称“慢SQL”&#xff0c;如果你对系统的接口性能要求较高的话&#xff0c;一定不会放过这种SQL&#xff0c;肯定会想办法进行解决&#xff0c;那么&#xff0c;导致慢 SQL 出现的原因&#xff0…

ref 操作 React 定时器

秒表 需要将 interval ID 保存在 ref 中&#xff0c;以便在需要时能够清除计时器。 import { useRef, useState } from "react";const SecondWatch () > {const [startTime, setStartTime] useState<any>(null);const [now, setNow] useState<any>…

【python爬虫】9.带着小饼干登录(cookies)

文章目录 前言项目&#xff1a;发表博客评论post请求 cookies及其用法session及其用法存储cookies读取cookies复习 前言 第1-8关我们学习的是爬虫最为基础的知识&#xff0c;从第9关开始&#xff0c;我们正式打开爬虫的进阶之门&#xff0c;学习爬虫更多的精进知识。 在前面几…

unity 之 如何获取父物体与子物体

文章目录 获取父物体获取子物体 获取父物体 在Unity中&#xff0c;你可以使用Transform组件的属性来获取对象的父物体。以下是在C#脚本中如何获取父物体的示例代码&#xff1a; using UnityEngine;public class GetParentExample : MonoBehaviour {void Start(){// 获取当前物…

【OpenCV实战】4.OpenCV 五种滤波使用实战(均值、盒状、中值、高斯、双边)

OpenCV 五种滤波使用实战(均值、盒状、中值、高斯、双边&#xff09; 〇、Coding实战内容一、滤波、核和卷积1.1 滤波1.2 核 & 滤波器1.3 公式1.4 例子 二、图片边界填充实战2.1 解决问题2.2 相关OpenCV函数2.3 Code 三. 均值滤波实战3.1 理论3.2 Blur3.3 Code 四. 盒状滤波…

南方科技大学博士研究生奖助学金,深圳大学

目录 南方科技大学 中南大学 南京大学 厦门大学 苏州大学 中南财经政法大学 深圳大学 南方科技大学 https://ocean.sustech.edu.cn/ocean/public/upload/download/3/2.pdf 南方科技大学的在读研究生&#xff0c;每人每年都会得到40000元的补助&#xff0c;这40000块钱分…

Flink中RPC实现原理简介

前提知识 Akka是一套可扩展、弹性和快速的系统&#xff0c;为此Flink基于Akka实现了一套内部的RPC通信框架&#xff1b;为此先对Akka进行了解 Akka Akka是使用Scala语言编写的库&#xff0c;基于Actor模型提供一个用于构建可扩展、弹性、快速响应的系统&#xff1b;并被应用…

Servlet属性、监听者和会话

没有servlet能单独存在。在当前的现代Web应用中&#xff0c;许多组件都是在一起协作共同完成一个目标。怎么让这些组件共享信息&#xff1f;如何隐藏信息&#xff1f;怎样让信息做到线程安全&#xff1f; 1 属性和监听者 1.1 初始化 容器初始化一个servlet时&#xff0c;会为…

LeetCode--HOT100题(47)

目录 题目描述&#xff1a;105. 从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;105. 从前序与中序遍历序列构造二叉树&#xff08;中等&#xff09; 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preo…

基于Vgg-Unet模型自动驾驶场景检测

1.VGG VGG全称是Visual Geometry Group属于牛津大学科学工程系&#xff0c;其发布了一些列以VGG开头的卷积网络模型&#xff0c;可以应用在人脸识别、图像分类等方面,VGG的输入被设置为大小为224x244的RGB图像。为训练集图像上的所有图像计算平均RGB值&#xff0c;然后将该图像…

系统错误码指示确立+日志模块手动配置

1&#xff0c;系统错误码指示确立 对于前后端分离的系统设计中&#xff0c;后端建立错误码指示对于前端非常重要可以指示错误存在地方&#xff1b;以用户注册为例&#xff1b; public interface SystemCode{int SYSTEM_USER_ERROR_ADD_FAIL 10000;int SYSTEM_USER_INFO_ADD …

Miniconda3环境迁移

问题&#xff1a; conda之前安装的默认路径空间满了没法进行安装&#xff0c;为此将其进行迁移&#xff0c;但是迁移之后报错 bash: /data/anaconda3/bin/conda: /home/anaconda3/bin/python: 坏的解释器: 没有那个文件或目录解决方案&#xff1a; 1、修改~/.bashrc中的环境…

B093-springsecurity整合jwt和RSA

目录 前后端分离后springsecurity核心filter的应用场景介绍JWT令牌的组成部分JWT案例导包TestJwt RSARsaUtilsTestRSA分析图 JWTRSA导包JwtUtilsTestRSAJWT 完善spring-security整合后且不连数据库的代码案例流程分析图 前后端分离后springsecurity核心filter的应用场景介绍 账…

Java设计模式:四、行为型模式-09:模板模式

文章目录 一、定义&#xff1a;模板模式二、模拟场景&#xff1a;模板模式三、改善代码&#xff1a;模板模式3.0 引入依赖3.1 工程结构3.2 模板模式结构图3.3 爬取商品生成海报实现3.3.1 HTTP获取连接类3.3.2 定义执行顺序的抽象类3.3.3 当当爬取抽象实现类3.3.4 京东爬取抽象实…

分享2款微课录制软件,保证让你满意!

“录微课用什么软件呀&#xff0c;真的服了&#xff0c;平台自带的录屏画质太差了&#xff0c;完全看不清讲的内容&#xff0c;而且音质也不是很好&#xff0c;大家有没有微课录制的软件推荐&#xff0c;谢谢啦” 随着教育方式的转型和技术的发展&#xff0c;微课程成为了一种…

422规范详解

概述&#xff1a; 全称为EIA-TIA-422-B&#xff0c;于1994年发布。 典型电路由一个发送器和N个接收器以及一个中断匹配电阻组成。 发送器&#xff1a; 差分输出电压值在2V~10V之间。 4.1.1 发送器输出阻抗 要求A/B之间的差分阻抗≤100Ω。 4.1.2 开路特性 要求差分电压≤…

从过滤器初识责任链设计模式

下面用的过滤器都是注解方式 可以使用非注解方式,就是去web.xml配置映射关系 上面程序的执行输出是 再加一个过滤器 下面来看一段程序 输出结果 和过滤器是否非常相识 但是上面这段程序存在的问题:在编译阶段已经完全确定了调用关系,如果你想改变他们的调用顺序或者继续添加一…

时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测

时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测 目录 时序预测 | MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神经网络时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-BiLSTM时间卷积双向长短期记忆神…