首页 > 其他分享 >11.文件和目录

11.文件和目录

时间:2023-08-21 18:33:41浏览次数:34  
标签:11 文件 函数 int st 描述符 目录

11.文件和目录

文件操作相关函数

stat/lstat函数

█函数描述: 获取文件属性

█函数原型: int stat(const char *pathname, struct stat *buf);

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

█函数返回值:

  ▶成功返回 0

  ▶失败返回 -1

struct stat 
{
	dev_t          st_dev;        //文件的设备编号
	ino_t           st_ino;        //节点
	mode_t         st_mode;      //文件的类型和存取的权限
	nlink_t         st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
	uid_t           st_uid;       //用户ID
	gid_t           st_gid;       //组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;     //最后一次改变时间(指属性)
};
-st_mode-- 16位整数
○ 0 - 2 bit -- 其他人权限
S_IROTH      00004  读权限
S_IWOTH     00002  写权限
S_IXOTH      00001  执行权限
S_IRWXO     00007  掩码, 过滤 st_mode中除其他人权限以外的信息

○ 3 - 5 bit -- 所属组权限
S_IRGRP     00040  读权限
S_IWGRP    00020  写权限
S_IXGRP     00010   执行权限
S_IRWXG    00070  掩码, 过滤 st_mode中除所属组权限以外的信息

○ 6 - 8 bit -- 文件所有者权限
S_IRUSR    00400    读权限
S_IWUSR   00200    写权限
S_IXUSR    00100     执行权限
S_IRWXU   00700    掩码, 过滤 st_mode中除文件所有者权限以外的信息
If(st_mode& S_IRUSR)---- - 为真表明可读
If(st_mode & S_IWUSR)------为真表明可写
If(st_mode & S_IXUSR)------为真表明可执行

○ 12 - 15 bit -- 文件类型
S_IFSOCK         0140000 套接字
S_IFLNK          0120000 符号链接(软链接)
S_IFREG          0100000 普通文件
S_IFBLK           0060000 块设备
S_IFDIR           0040000 目录
S_IFCHR           0020000 字符设备
S_IFIFO           0010000 管道
S_IFMT 0170000 掩码, 过滤 st_mode中除文件类型以外的信息

If((st_mode& S_IFMT) == S_IFREG)----为真普通文件
if (S_ISREG(st_mode))------为真表示普通文件
if (S_ISDIR(st.st_mode))------为真表示目录文件

stat函数和lstat函数的区别

  ▶对于普通文件,这两个函数没有区别,是一样的。

  ▶对于连接文件,调用lstat函数获取的是链接文件本身的属性信息;而stat函数获取的是链接文件指向的文件的属性信息。

练习:

1 stat函数获取文件大小

2 stat函数获取文件类型和文件权限

3 lstat函数获取连接文件的属性(文件大小)

目录操作相关函数

opendir函数

█函数描述:打开一个目录

█函数原型: DIR *opendir(const char *name);

█函数返回值: 指向目录的指针

█函数参数: 要遍历的目录(相对路径或者绝对路径)

readdir函数

█函数描述: 读取目录内容--目录项

█函数原型: struct dirent *readdir(DIR *dirp);

█函数返回值: 读取的目录项指针

█函数参数: opendir函数的返回值

struct dirent
{
	ino_t d_ino;       // 此目录进入点的inode
	off_t d_off;       // 目录文件开头至此目录进入点的位移
	signed short int d_reclen;  // d_name 的长度, 不包含NULL 字符
	unsigned char d_type;   // d_name 所指的文件类型 
	char d_name[256];       // 文件名
};

d_type的取值:

  ▶DT_BLK - 块设备

  ▶DT_CHR - 字符设备

  ▶DT_DIR - 目录

  ▶DT_LNK - 软连接

  ▶DT_FIFO - 管道

  ▶DT_REG - 普通文件

  ▶DT_SOCK - 套接字

  ▶DT_UNKNOWN - 未知

closedir函数

█函数描述: 关闭目录

█函数原型: int closedir(DIR *dirp);

█函数返回值: 成功返回0, 失败返回-1

█函数参数: opendir函数的返回值

读取目录内容的一般步骤

1 DIR *pDir = opendir(“dir”); //打开目录

2 while((p=readdir(pDir))!=NULL){} //循环读取文件

3 closedir(pDir); //关闭目录

练习

1 遍历指定目录下的所有文件, 并判断文件类型.

2 递归遍历目录下所有的文件, 并判断文件类型.

特别注意: 递归遍历指定目录下的所有文件的时候, 要过滤掉.和..文件, 否则会进入死循环

dup/dup2/fcntl

dup函数

▶函数描述: 复制文件描述符

▶函数原型: int dup(int oldfd);

▶函数参数: oldfd -要复制的文件描述符

▶函数返回值:

  ◆成功: 返回最小且没被占用的文件描述符

  ◆失败: 返回-1, 设置errno值

练习: 编写程序,测试dup函数。

dup2函数

▶函数描述: 复制文件描述符

▶函数原型: int dup2(int oldfd, int newfd);

▶函数参数:

 ◆oldfd-原来的文件描述符

 ◆newfd-复制成的新的文件描述符

▶函数返回值:

 ◆成功: 将oldfd复制给newfd, 两个文件描述符指向同一个文件

 ◆失败: 返回-1, 设置errno值

▶假设newfd已经指向了一个文件,首先close原来打开的文件,然后newfd指向oldfd指向的文件.

  若newfd没有被占用,newfd指向oldfd指向的文件。

练习:

1编写程序,测试dup2函数实现文件描述符的复制。

2 编写程序,完成终端标准输出重定向到文件中

fcntl函数

▶函数描述: 改变已经打开的文件的属性

▶函数原型: int fcntl(int fd, int cmd, ... /* arg */ );

 ◆若cmd为F_DUPFD, 复制文件描述符, 与dup相同

 ◆若cmd为F_GETFL, 获取文件描述符的flag属性值

 ◆若cmd为 F_SETFL, 设置文件描述符的flag属性

▶函数返回值:返回值取决于cmd

 ◆成功

  ◇若cmd为F_DUPFD,返回一个新的文件描述符

  ◇若cmd为F_GETFL,返回文件描述符的flags值

  ◇若cmd为 F_SETFL,返回0

 ◆失败返回-1,并设置errno值.

▶fcntl函数常用的操作:

 1 复制一个新的文件描述符:

  int newfd = fcntl(fd, F_DUPFD, 0);

 2 获取文件的属性标志

  int flag = fcntl(fd, F_GETFL, 0)

 3 设置文件状态标志

  flag = flag | O_APPEND;

  fcntl(fd, F_SETFL, flag)

 4 常用的属性标志

  O_APPEND-----设置文件打开为末尾添加

  O_NONBLOCK-----设置打开的文件描述符为非阻塞

练习:

1 使用fcntl函数实现复制文件描述符

2 使用fcntl函数设置在打开的文件末尾添加内容。

标签:11,文件,函数,int,st,描述符,目录
From: https://www.cnblogs.com/codemagiciant/p/17646767.html

相关文章

  • linux 下快速启动 webd 映射本地目录为网盘使用
    快速执行:curl-shttp://harbor.geoonline.geo:2015/tools/startup_webd.sh|bash可以跟两个参数,分别表示网盘根目录和http端口号 脚本如下:#!/bin/bashWEBD_ROOT="$1"WEBD_PORT="$2"WEBD_VERSION=$(curl-shttps://cnt2.cf/webd/changelog.txt|head-n1)WEB......
  • SpringBoot复习:(41)配置文件中配置的server开头的属性是怎么配置到Servlet容器中起作用
    ServletWebServerFactoryAutoConfiguration类:可以看到其中使用了@EnableConfigurationProperties导入了ServerProperties而ServerProperties通过使用@ConfigurationProperties注解导入了配置文件中已server开头的那些配置项。可以看到ServletWebServerFactory定义了一个类型为Se......
  • 没人用还占空间 微软Win11系统将允许卸载更多内置软件
    不出意外的话,下个月Win11系统就要迎来Win1123H2升级了,这是第二个年度更新,带来永不合并任务栏、ZIP解压缩原生支持等新功能。在推新的同时,微软还要除旧,Win11系统内置了很多应用,一些是集成到系统功能中的,一些是Win商店中的。之前这些软件应用都不给你卸载的机会,要么就是卸载起来......
  • 数据治理专业认证CDMP学习笔记(思维导数据治理专业认证CDMP学习笔记(思维导图与知识点)-
    大家好,我是独孤风,一位曾经的港口煤炭工人,目前在某国企任大数据负责人,公众号大数据流动主理人。在最近的两年的时间里,因为公司的需求,还有大数据的发展趋势所在,我开始学习数据治理的相关知识。数据治理需要进行系统的学习才能真正掌握,也需要进行专业的考试认证才能证明自己在数据治理......
  • 11 JavaScript关于时间
    11JavaScript关于时间获取js的时间使用内置的Date函数完成vard=newDate();//获取系统时间//vard=newDate('2023-08-1514:11:48');//得到一个具体时间console.log(d)//时间格式化year=d.getFullYear();//拿到年份month=d.getMonth()+1;/......
  • 如何找到 Java安装目录的路径以及如何重新安装java
    要找到Java安装目录的路径,可以按照以下步骤进行:1.打开文件资源管理器(Windows资源管理器)。2.导航到你的计算机的C盘或系统盘。3.在C盘或系统盘上查找一个名为"ProgramFiles"或"程序文件"的文件夹。如果你的计算机是64位操作系统,可能会有两个类似的文件夹,一个是"ProgramFile......
  • 在Windows系统上运行.sh文件的一些方法
    在Windows系统上,默认情况下是无法直接运行.sh文件的,因为.sh文件是Unix/Linux系统上的Shell脚本文件。但是,你可以使用一些工具或方法来在Windows系统上运行.sh文件:1.使用Cygwin:Cygwin是一个在Windows上提供类似Unix环境的开源工具。通过安装Cygwin,你可以在Windows上运行.sh文件。......
  • 「USACO11NOV」 Cow Lineup S
    「USACO11NOv1」CowLineupS题解问题描述农民约翰雇一个专业摄影师给他的部分牛拍照。由于约翰的牛有好多品种,他喜欢他的照片包含每个品种的至少一头牛。约翰的牛都站在一条沿线的不同地方,每一头牛由一个整数位置\(X_i\)以及整数品种编号\(ID_i\)表示。约翰想拍一张照片,这......
  • 合并文件
    defmerge_file(result_dict):ifnotisinstance(result_dict,dict):raiseValueError('inputparametermustdict!')iflen(result_dict)<=1:raiseValueError('{}cannotbeNoneandatleast2dataframe!'.f......
  • git将已跟踪文件加入gitignore
    如果不小心将target文件提交过远程仓库,已经被git管理,此时直接加入gitignore是不生效的,需要先将其从git的托管中脱离出来。脱离方法:gitrm-r--cached<需要脱离的文件路径,可以是文件夹,也可以是多个文件>将文件或路径添加到.gitignore文件中git添加并推送到远程仓库中。......