Linux Day3 目录,文件相关的函数介绍

server/2024/10/11 13:19:38/

file*p 和int fd转换的函数

fileno(  FILE *p ->int fd)

函数原型

int fileno(FILE *stream);

参数说明

  • stream: 指向 FILE 结构的指针,表示要获取文件描述符的流。

返回值

  • 成功时,返回与 stream 相关联的文件描述符。

  • 如果 stream 是 NULL 或者其他错误发生,返回 -1

使用案例

#include <stdio.h>
#include <unistd.h>int main() {FILE *fp = fopen("example.txt", "w");if (fp == NULL) {perror("Error opening file");return 1;}// 获取文件流的文件描述符int fd = fileno(fp);printf("The file descriptor is: %d\n", fd);// 使用文件描述符进行操作,例如关闭文件close(fd); // 注意:这将关闭与流关联的底层文件描述符return 0;
}

fdopen

函数原型

FILE *fdopen(int fd, const char *mode);

参数说明

  • fd: 一个整数,表示已打开的文件描述符。

  • mode: 一个字符串,指定了流的模式,可以是 "r"、"w"、"a" 等,类似于 fopen 函数中的模式参数。

返回值

  • 成功时,返回指向新创建的 FILE 流对象的指针。

  • 失败时,返回 NULL 并设置 errno 以指示错误。

示例

#include <stdio.h>
#include <fcntl.h>int main() {int fd = open("example.txt", O_RDONLY);if (fd == -1) {perror("open");return 1;}FILE *fp = fdopen(fd, "r"); // 将文件描述符与读模式的流关联if (fp == NULL) {perror("fdopen");close(fd);return 1;}// 使用标准I/O函数操作文件...fclose(fp); // 关闭流,注意这不会关闭底层的文件描述符close(fd);  // 需要手动关闭文件描述符return 0;
}

需要注意的是,fclose 不会关闭底层的文件描述符,因此需要手动关闭它 。

目录

目录可以当作文件来看,只不过读取目录操作不一样。

1.打开目标目录   

2.读取目录

3.关闭目录

目录操作的函数

1.opendir

原型

DIR *opendir(const char *dirname);

参数说明

  • dirname: 一个指向以 null 结尾的字符串的指针,表示要打开的目录的路径。

  • DIR* 目录流指针

返回值

  • 成功时,返回指向 DIR 结构的指针,该结构用于后续的目录读取操作。

  • 失败时,返回 NULL 并设置 errno 以指示错误类型。

错误处理

如果 opendir 调用失败,errno 可能会被设置为以下值之一:

  • EACCES: 权限不足,无法访问指定的目录。

  • EMFILE: 进程已经达到了文件描述符的限制。

  • ENFILE: 系统已经达到了文件描述符的限制。

  • ENOENT: 指定的目录不存在。

  • ENOTDIRdirname 不是一个目录。

  • EBADF: 无效的目录流。

readdir

原型

struct dirent *readdir(DIR *dir);

参数说明

  • dir: 指向之前使用 opendir 成功打开的目录流的指针。

返回值

  • 成功时,返回指向 struct dirent 的指针,该结构包含了目录条目的信息。

  • 到达目录流末尾或发生错误时,返回 NULL

结构体   struct dirent

 struct dirent 通常包含以下字段:

  • d_ino: 条目的 inode 号(在某些系统上可能不可用)。   

  • d_off: 目录流中的偏移量,可以用于 seekdir 或 telldir

  • d_reclenstruct dirent 条目的长度。

  • d_type :文件类型

  • d_name: 以 null 结尾的字符数组,包含了条目的名称。//char型

closedir

原型:

int closedir(DIR *dir);

参数说明

  • dir: 指向之前使用 opendir 成功打开的目录流的指针。

返回值

  • 成功关闭目录流时,返回 0。

  • 如果发生错误,返回 -1 并设置 errno 以指示错误类型。

应用:打开当前目录

int main(int argc, const char *argv[])
{DIR * dir=opendir("./");//当前目录if(NULL==dir){fprintf(stderr,"opendir error\n");return 1;}while(1){struct dirent *info =readdir(dir);if(NULL== info){break;}printf("%s\n",info->d_name);}closedir(dir);return 0;
}                                                

结果

1.txt
.       //表示当前文件
a.out
lesson.c
..      //表示上一路径

需要注意, . ,..  着两个目录是所有目录都有的,一个表示当前的目录,一个表示上一路径。

根目录相关函数

chdir   (cd)

原型

int chdir(const char *path);

参数说明

  • path: 一个指向以 null 结尾的字符串的指针,表示要切换到的目标目录的路径。

返回值

  • 成功时,返回 0。

  • 失败时,返回 -1 并设置 errno 以指示错误类型。

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{int ret = chdir("..");if(-1 == ret){fprintf(stderr,"chdir error\n");return 1;}fopen("aaa","w");return 0;
}
getcwd  (pwd)

原型

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

参数说明

  • buf: 一个指向字符数组的指针,用于接收当前工作目录的路径。如果为 NULL,则函数会分配一个足够大的缓冲区。

  • sizebuf 数组的大小(以字节为单位)。如果 buf 为 NULL,这个参数会被忽略。

返回值

  • 成功时,返回指向包含当前工作目录路径的字符串的指针。

  • 失败时,返回 NULL 并设置 errno 以指示错误类型。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[])
{char buf[256]={0};getcwd(buf,sizeof(buf));printf("current path is %s\n",buf);chdir("../");getcwd(buf,sizeof(buf));printf("change path is %s\n",buf);return 0;
}

练习:寻找目录下的.c文件

int main(int argc, const char *argv[])
{char buf[512]={0};                                                 if(argc<2){fprintf(stdout," usage error\n");return 1;}DIR * dir=opendir(argv[1]);if(NULL==dir){fprintf(stderr,"opendir error\n");return 1;}while(1){struct dirent *info =readdir(dir);if(NULL== info){break;}int k=strlen(info->d_name);if(k>=3){if((info->d_name)[k-1]=='c'&&(info->d_name)[k-2]=='.'){printf("%s\n",info->d_name);}}}closedir(dir);return 0;}

mkdir

原型

int mkdir(const char *path, mode_t mode);

参数说明

  • path: 一个指向以 null 结尾的字符串的指针,表示要创建的目录的路径。

  • mode: 新创建目录的权限模式。这个模式受进程的 umask 影响,并且可以包括文件访问权限位,例如 S_IRWXU(可读、可写、可执行)等。

返回值

  • 成功时,返回 0。

  • 失败时,返回 -1 并设置 errno 以指示错误类型。


#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{int ret = mkdir("aaa",0777);if(-1 == ret){fprintf(stderr,"mkdir error\n");return 1;}return 0;
}

rmdir

原型

int rmdir(const char *path);

参数说明

  • path: 一个指向以 null 结尾的字符串的指针,表示要删除的目录的路径。

返回值

  • 成功时,返回 0。

  • 失败时,返回 -1 并设置 errno 以指示错误类型。

#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{int ret = rmdir("./aaa");if(-1 == ret){fprintf(stderr,"rmdir error\n");return 1;}return 0;
}

注意,这个函数只能删除空目录,即目录下无文件,该函数用的比较少,一般用rm。

文件相关函数

stat

用于获取文件或目录的状态信息。

原型

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

参数说明

  • path: 一个指向以 null 结尾的字符串的指针,表示要获取状态信息的文件或目录的路径。

  • buf: 一个指向 struct stat 结构的指针,该结构用于接收文件或目录的状态信息。

返回值

  • 成功时,返回 0。

  • 失败时,返回 -1 并设置 errno 以指示错误类型。

结构体 struct stat

struct stat 结构包含了以下一些字段(具体字段可能因系统而异):

  • st_dev: 设备 ID,文件所在的设备。

  • st_ino: inode 号,唯一标识文件系统中的文件。

  • st_mode: 文件模式,包含文件类型和权限。

  • st_nlink: 硬链接数。

  • st_uid 和 st_gid: 文件所有者的用户 ID 和组 ID。

  • st_size: 文件大小,以字节为单位。

  • st_blksize: 块大小,最优 I/O 操作块大小。

  • st_blocks: 占用的块数。

  • st_atimest_mtimest_ctime: 访问时间、修改时间和状态改变时间。

系统时间获取

1.time

在 C 语言中,time 是一个与时间和日期相关的函数,它用于获取当前时间自纪元(Epoch,即1970年1月1日 00:00:00 UTC)以来的秒数。这个函数定义在 <time.h> 头文件中。

原型

time_t time(time_t *tp);

参数说明

  • tp: 一个指向 time_t 类型的可选参数。如果提供了这个参数,time 函数会将当前时间的副本存储在 tp 指向的位置。

返回值

  • 成功时,返回当前时间自纪元以来的秒数。

  • 失败时,返回 ((time_t) -1) 并设置 errno 以指示错误类型。

时间转换函数

1.ctime()

原型

char *ctime(const time_t *timep);

参数说明

  • timep: 指向 time_t 类型的指针,表示要转换的时间戳。

返回值

  • ctime 返回一个以 null 结尾的字符串,该字符串表示对应的时间戳。格式通常是 "Wed Jun 21 23:59:59 1999\n"。

  • 注意:返回的字符串存储在静态内存中,因此每次调用 ctime 都会覆盖上一次的返回值。

#include <stdio.h>
#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间的时间戳if (current_time == ((time_t) -1)) {perror("time failed");return 1;}// 将时间戳转换为可读的字符串char *time_str = ctime(&current_time);printf("Current time: %s", time_str);return 0;
}
2.localtime

原型

struct tm *localtime(const time_t *timep);

参数说明

  • timep: 指向 time_t 类型的指针,表示要转换的时间戳。

返回值

  • localtime 返回一个指向 struct tm 的指针,该结构包含了本地时间的详细信息。

  • 如果转换失败,返回 NULL 并设置 errno

结构体 struct tm

struct tm 结构包含了以下字段:

  • tm_sec: 秒(0-59)。

  • tm_min: 分钟(0-59)。

  • tm_hour: 小时(0-23)。

  • tm_mday: 一个月中的第几天(1-31)。

  • tm_mon: 年份中第几个月,从 0(1月)开始。

  • tm_year: 自 1900 年以来的年数。

  • tm_wday: 一周中的第几天,从 0(周日)开始。

  • tm_yday: 一年中的第几天,从 0(1月1日)开始。

  • tm_isdst: 夏令时标志。


http://www.ppmy.cn/server/100414.html

相关文章

黑马头条vue2.0项目实战(八)——文章评论

目录 1. 展示文章评论列表 1.1 准备组件 1.2 获取文章评论数据并展示 1.3 展示文章评论总数量 1.4 文章评论项 2. 评论点赞 3. 发布文章评论 3.1 准备弹出层 3.2 封装发布文章评论组件 3.3 请求发布 4. 评论回复 4.1 准备回复弹层 4.2 封装内容组件 4.3 处理头部…

MySQL靶场攻击

靶场搭建 修改配置文件 vim /etc/my.cof [mysqld] secure_file_priv local-infile1 [mysql] local-infile1 安装相关环境 yum install php php-mysql -y 添加配置 vim /etc/httpd/conf/httpd.conf AddType application/x-httpd-php-source .phps AddType application/x-htt…

Spring Boot优缺点

Spring Boot 是一款用于简化Spring应用开发的框架&#xff0c;它集成了大量常用的框架和工具&#xff0c;大大简化了Spring项目的配置和部署。下面是Spring Boot的优缺点&#xff1a; 优点&#xff1a; 简化配置&#xff1a;Spring Boot自动配置功能可以根据应用的依赖自动配…

使用Gitea搭建git本地服务器

前言 作为一个程序员&#xff0c;我认为代码管理是很重要的&#xff0c;在项目开发过程中&#xff0c;随着代码的不断更新迭代&#xff0c;可能已经不知道一开始的代码是什么样子了&#xff0c;又或者时间久了不知道自己改了什么&#xff0c;而git就是一个很好的代码管理工具&a…

SpringBoot快速入门(手动创建)

目录 案例&#xff1a;需求 步骤 1 创建Maven项目 2 导入SpringBoot起步依赖 3 定义Controller 4 编写引导类 案例&#xff1a;需求 搭建简单的SpringBoot工程&#xff0c;创建hello的类定义h1的方法&#xff0c;返回Hello SpringBoot! 步骤 1 创建Maven项目 大家&…

分享|华为测试OD岗面试流程

作者&#xff1a;DLAM 链接&#xff1a;leetcode.cn/circle/discuss/XpySJs/ 抱着试一试的心态&#xff0c;面试了华为的OD岗位&#xff0c;误打误撞进入了总决赛&#xff0c;记录一下给各位友友&#xff0c;流程大概一个月&#xff0c;职级定D3&#xff0c;薪酬22K&#xff0…

fastjson反序列化漏洞

一、漏洞简介 Fastjson是阿里巴巴公司开源的一款高性能的Java语言JSON处理库&#xff0c;广泛应用于Web开发、数据交换等领域。然而&#xff0c;由于Fastjson在解析JSON数据时存在安全漏洞&#xff0c;攻击者可以利用该漏洞执行任意代码&#xff0c;导致严重的安全威胁。 二、…

平安城市/雪亮工程现状及需求分析:EasyCVR视频汇聚平台助力雪亮工程项目建设

一、背景现状 经过近几年的努力&#xff0c;平安城市雪亮工程建设取得了显著的成绩&#xff0c;完成了前端高清视频点位和高清卡口系统建设&#xff0c;建成了&#xff08;视频监控类&#xff09;、&#xff08;卡口类&#xff09;和&#xff08;应用类&#xff09;的平台。这…