news 2026/9/3 4:05:16

Linux文件IO与目录IO编程深度解析:从系统调用到实战应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux文件IO与目录IO编程深度解析:从系统调用到实战应用

目录

1 文件IO编程基础

1.1 文件IO与标准IO的区别

1.2 文件描述符概念

2 文件IO核心函数详解

2.1 文件打开函数open

2.2 文件关闭函数close

2.3 文件写入函数write

2.4 文件读取函数read

2.5 文件定位函数lseek

3 文件IO实战应用

3.1 图片文件拷贝示例

3.2 文件大小统计程序

4 目录IO编程

4.1 目录操作核心函数

4.1.1 打开目录opendir

4.1.2 关闭目录closedir

4.1.3 读取目录项readdir

4.2 目录创建与删除

4.2.1 创建目录mkdir

4.2.2 删除目录rmdir

4.3 目录遍历实战示例

4.4 工作目录操作

4.4.1 切换工作目录chdir

4.4.2 获取当前目录getcwd

5 时间相关接口

5.1 时间获取函数

5.1.1 获取当前时间time

5.1.2 时间转换localtime

5.1.3 时间生成mktime


1 文件IO编程基础

1.1 文件IO与标准IO的区别

文件IO(文件输入输出)是Linux系统编程中直接使用系统调用的IO方式,与标准IO相比具有以下特点:

核心差异

  • 缓存机制:文件IO无缓存,标准IO有缓存

  • 函数类型:文件IO是系统调用,标准IO是库函数

  • 适用场景:文件IO适合设备文件、通信文件,标准IO适合普通文件

  • 性能特点:文件IO实时性强,标准IO效率高

系统调用与库函数关系

  • 系统调用:Linux内核提供的底层接口

  • 库函数:对系统调用的封装,提供更友好的接口

1.2 文件描述符概念

文件描述符是Linux内核为每个打开文件分配的唯一标识符,是一个非负整数。系统默认打开三个文件描述符:

  • 0:标准输入(stdin)

  • 1:标准输出(stdout)

  • 2:标准错误(stderr)

文件描述符特性

  • 有上限限制(可通过ulimit -n查看)

  • 新描述符选择最小未使用的非负整数

  • 进程结束时自动关闭所有打开的文件描述符

2 文件IO核心函数详解

2.1 文件打开函数open

#include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);

参数说明

  • pathname:文件路径

  • flags:打开标志位

  • mode:文件权限(创建文件时使用)

常用flags标志

O_RDONLY // 只读 O_WRONLY // 只写 O_RDWR // 读写 O_CREAT // 文件不存在则创建 O_TRUNC // 文件存在则截断清空 O_APPEND // 追加模式 O_EXCL // 与O_CREAT配合,文件存在则报错

权限模式示例

0664 // rw-rw-r-- 0777 // rwxrwxrwx

open与fopen模式对应关系

"r" -> O_RDONLY "r+" -> O_RDWR "w" -> O_WRONLY | O_CREAT | O_TRUNC, 0664 "w+" -> O_RDWR | O_CREAT | O_TRUNC, 0664 "a" -> O_WRONLY | O_CREAT | O_APPEND, 0664 "a+" -> O_RDWR | O_CREAT | O_APPEND, 0664

2.2 文件关闭函数close

#include <unistd.h> int close(int fd);

关闭文件描述符,释放系统资源。成功返回0,失败返回-1。

2.3 文件写入函数write

#include <unistd.h> ssize_t write(int fd, const void *buf, size_t count);

参数说明

  • fd:文件描述符

  • buf:写入数据缓冲区

  • count:要写入的字节数

返回值

  • 成功:实际写入的字节数

  • 失败:-1

2.4 文件读取函数read

#include <unistd.h> ssize_t read(int fd, void *buf, size_t count);

参数说明

  • fd:文件描述符

  • buf:读取数据缓冲区

  • count:最大读取字节数

返回值

  • 成功:实际读取的字节数

  • 文件末尾:0

  • 失败:-1

2.5 文件定位函数lseek

#include <sys/types.h> #include <unistd.h> off_t lseek(int fd, off_t offset, int whence);

whence参数

SEEK_SET // 文件开头 SEEK_CUR // 当前位置 SEEK_END // 文件末尾

特殊用法

lseek(fd, 0, SEEK_END); // 获取文件大小 lseek(fd, 0, SEEK_SET); // 回到文件开头

3 文件IO实战应用

3.1 图片文件拷贝示例

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> int main(void) { int fp1 = 0; int fp2 = 0; char tmpbuff[1024] = {0}; ssize_t nret = 0; fp1 = open("ssr.bmp",O_RDONLY); if(-1 == fp1) { perror("fail to open"); return -1; } fp2 = open("dst.bmp",O_WRONLY | O_CREAT | O_TRUNC, 0664); if(-1 == fp1) { perror("fail to open"); return -1; } while (1) { nret = read(fp1,tmpbuff,sizeof(tmpbuff)); if(nret == 0) { break; } write(fp2,tmpbuff,nret); } return 0; }

3.2 文件大小统计程序

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <sys/stat.h> int main() { int fd; char filename[256]; off_t file_size; printf("请输入文件路径: "); scanf("%s", filename); // 打开文件 fd = open(filename, O_RDONLY); if (fd == -1) { perror("文件打开失败"); return -1; } // 获取文件大小 file_size = lseek(fd, 0, SEEK_END); if (file_size == -1) { perror("获取文件大小失败"); close(fd); return -1; } printf("文件大小: %ld 字节 (%.2f KB)\n", file_size, (double)file_size / 1024); close(fd); return 0; }

4 目录IO编程

4.1 目录操作核心函数

4.1.1 打开目录opendir
#include <dirent.h> DIR *opendir(const char *name);
4.1.2 关闭目录closedir
#include <dirent.h> int closedir(DIR *dirp);
4.1.3 读取目录项readdir
#include <dirent.h> struct dirent *readdir(DIR *dirp);

dirent结构体重要成员

ino_t d_ino; // 索引节点号 char d_name[256]; // 文件名

4.2 目录创建与删除

4.2.1 创建目录mkdir
#include <sys/stat.h> #include <sys/types.h> int mkdir(const char *pathname, mode_t mode);

目录权限说明

  • 读权限(r):查看目录项

  • 写权限(w):在目录中新建/删除文件

  • 执行权限(x):进入目录

4.2.2 删除目录rmdir
#include <unistd.h> int rmdir(const char *pathname);

只能删除空目录。

4.3 目录遍历实战示例

#include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <string.h> #include <dirent.h> int main(void) { DIR *dp = NULL; struct dirent *pp = NULL; dp = opendir("."); if (NULL == dp) { perror("fail to opendir"); return -1; } while(1) { pp = readdir(dp); if (NULL == pp) { break; } if (pp->d_name[0] == '.') { continue; } printf("%s\n", pp->d_name); } closedir(dp); return 0; }

4.4 工作目录操作

4.4.1 切换工作目录chdir
#include <unistd.h> int chdir(const char *path);
4.4.2 获取当前目录getcwd
#include <unistd.h> char *getcwd(char *buf, size_t size);

使用示例

#include <stdio.h> #include <unistd.h> int main() { char cwd[1024]; if (getcwd(cwd, sizeof(cwd)) != NULL) { printf("当前工作目录: %s\n", cwd); } else { perror("获取当前目录失败"); } // 切换目录 if (chdir("/tmp") == 0) { printf("成功切换到 /tmp 目录\n"); } else { perror("切换目录失败"); } return 0; }

5 时间相关接口

5.1 时间获取函数

5.1.1 获取当前时间time
#include <time.h> time_t time(time_t *tloc);

返回1970年1月1日至今的秒数。

5.1.2 时间转换localtime
#include <time.h> struct tm *localtime(const time_t *timep);

tm结构体成员

int tm_sec; // 秒 [0-59] int tm_min; // 分 [0-59] int tm_hour; // 时 [0-23] int tm_mday; // 日 [1-31] int tm_mon; // 月 [0-11] int tm_year; // 年(从1900开始) int tm_wday; // 星期 [0-6] int tm_yday; // 年内天数 [0-365] int tm_isdst; // 夏令时标志
5.1.3 时间生成mktime
#include <time.h> time_t mktime(struct tm *tm);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/3 2:31:26

Linux命令-lsattr(查看文件的第二扩展文件系统属性)

&#x1f9ed;说明 lsattr 命令用于显示文件或目录在Linux文件系统中的隐藏属性。这些属性提供了对文件更精细的控制&#xff0c;例如设置文件只可追加内容或不可修改&#xff0c;常用于系统安全和数据保护。 下面这个表格整理了 lsattr 命令的常用选项。选项说明-a列出目录下的…

作者头像 李华
网站建设 2026/9/3 1:02:25

官宣升级!Claude Opus 4.6 正式发布,能力全面拉满,一步 API 即刻畅用

Anthropic 再次放出重磅更新&#xff0c;旗下旗舰级大模型 Claude Opus 4.6 正式亮相。本次版本不仅对核心能力进行了系统级强化&#xff0c;还同步上线多项高价值功能&#xff0c;面向开发者和企业用户全面升级。 更重要的是&#xff0c;如今无需繁琐的官方流程&#xff0c;通…

作者头像 李华
网站建设 2026/9/2 22:16:56

前端效率翻倍!Open-Lovable 克隆网页 + cpolar 穿透,告别局域网限制

Open-Lovable 是一款面向前端开发者的开源工具&#xff0c;核心功能是将任意网页快速克隆为可编辑的 React 应用&#xff0c;还支持 Anthropic Claude、OpenAI GPT-5 等多款 AI 模型&#xff0c;能自动拆分组件、保留完整 CSS 样式&#xff0c;不管是新手学习优秀网站结构&…

作者头像 李华
网站建设 2026/9/3 3:48:38

MyBatis最佳实践

MyBatis是一款非常流行的ORM框架&#xff0c;相信很多小伙伴都在使用。我们经常会把它和MyBatis-Plus或者MBG一起使用&#xff0c;用多了之后对于其一些常规操作就不太熟悉了。最近总结了下MyBatis的实用用法和技巧&#xff0c;希望对大家有所帮助&#xff01;MyBatis简介MyBat…

作者头像 李华
网站建设 2026/9/2 5:46:09

jd商品详情 API 接口- item_get_pro 全平台商品

一、电商数据抓取 在电商数据抓取领域&#xff0c;京东作为国内最大的电商平台之一&#xff0c;其数据的获取一直是众多开发者关注的焦点。item_get_pro 接口作为获取京东商品详情信息的重要工具&#xff0c;为我们在数据分析、竞品研究等方面提供了有力支持。今天&#xff0c;…

作者头像 李华
网站建设 2026/9/2 10:24:59

凤城五路见证:招商林屿缦岛首开203套售罄,市场热度彰显品质实力

2026年2月8日&#xff0c;西安凤城五路迎来了一场关于品质居住的集体投票。招商蛇口西安林屿缦岛首开203套房源&#xff0c;当日即告售罄。这一现象&#xff0c;不仅为春日的西安楼市注入了一抹亮色&#xff0c;更为市场提供了一个值得深思的样本&#xff1a;在理性回归的当下&…

作者头像 李华