文件I/O
Linux顶层目录结构:
/ 根目录
├── bin 存放用户二进制文件
├── boot 存放内核引导配置文件
├── dev 存放设备文件
├── etc 存放系统配置文件
├── home 用户主目录
├── lib 动态共享库
├── lost+found 文件系统恢复时的恢复文件
├── media 可卸载存储介质挂载点
├── mnt 文件系统临时挂载点
├── opt 附加的应用程序包
├── proc 系统内存的映射目录,提供内核与进程信息
├── root root 用户主目录
├── sbin 存放系统二进制文件
├── srv 存放服务相关数据
├── sys sys 虚拟文件系统挂载点
├── tmp 存放临时文件
├── usr 存放用户应用程序
└── var 存放邮件、系统日志等变化文件
文件操作一般用到5个函数:
open、read、write、lseek、close
对于内核而言,所有打开的文件都通过文件描述符(非负整数)引用。当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符。
当读写一个文件时,用open或creat返回一个文件描述符标识该文件,将其所为参数传给read或write。
UNIX系统shell使用文件描述符0、1、2分别与进程的标准输入、标准输出、标准错误输出相关联。
在依从POSIX的应用程序中,幻数0、1、2应替换成符号常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,定义在头文件<unistd.h>中。
/dev/fd/的目录其目录项是名为0,1,2等文件,打开文件/dev/fd/n相当于复制描述符n。
fd = open("/dev/fd/0", mode)等效于fd = dup(0)
open函数
oflag常量包含:O_RDONLY、O_WRONLY、O_RDWR、O_APPEND、O_CREAT等。
lseek函数
设置当前文件偏移量。
whence值为:
read函数
因为read和write都在内核执行,所以称这些函数为不带缓冲的I/O函数。
每个打开的文件(或设备)都有一个v节点(v-node)结构。v节点包含了文件类型和对此文件进行操作的函数的指针。v节点包含了该文件的i节点(i-node索引节点)。
打开文件的内核数据结构 两个独立进程各自打开同一个文件
在完成每个write后,在文件表项中的当前文件偏移量即增加所写的字节数。
dup函数或fork后,父、子进程对于每一个打开文件描述符共享同一个文件表项。
原子操作用pread和pwrite
调用pread相当于顺序调用lseek和read,过程中无法终端其定位和读操作,不更新文件指针。
复制一个现存的文件描述符
sync、fsync和fdatasync函数
"r"(只读)
为输入打开一个文本文件,不存在则失败
"w"(只写)
为输出打开一个文本文件,不存在则新建,存在则删除后再新建
"a"(追加)
向文本文件尾部增加数据,不存在则创建,存在则追加
'rb"(只读)
为输入打开一个二进制文件,不存在则失败
"wb"(只写)
为输入打开一个二进制文件,不存在则新建,存在则删除后新建
"ab"(追加)
向二进制文件尾部增加数据,不存在则创建,存在则追加
"r+"(读写)
为读写打开一个文本文件,不存在则失败
"w+" (读写)
为读写建立一个新的文本文件,不存在则新建,存在则删除后新建
"a+"(读写)
为读写打开一个文本文件,不存在则创建,存在则追加
"rb+"(读写)
为读写打开一个二进制文件,不存在则失败
"wb+"(读写)
为读写建立一个新的二进制文件,不存在则新建,存在则删除后新建
"ab+"(读写)
为读写打开一个二进制文件,不存在则创建,存在则追加
文件有文件名与数据,这在 Linux 上被分成两个部分:用户数据 (user data) 与元数据 (metadata)。用户数据,即文件数据块 (data block),数据块是记录文件真实内容的地方;而元数据则是文件的附加属性,如文件大小、创建时间、所有者等信息。在 Linux 中,元数据中的 inode 号(inode 是文件元数据的一部分但其并不包含文件名,inode 号即索引节点号)才是文件的唯一标识而非文件名。文件名仅是为了方便人们的记忆和使用,系统或程序通过 inode 号寻找正确的文件数据块。在 Linux 系统中查看 inode 号可使用命令 stat 或 ls -i。
Linux链接分为硬链接和符号链接(软链接)。默认ln命令产生硬链接。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。
硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。
文件类型:
(1)普通文件
(2)目录文件
(3)块特殊文件:提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
(4)字符特殊文件:提供对设备不带缓冲的访问,每次访问长度可变。系统所有设备是字符特殊文件或块特殊文件。
(5)FIFO:用于进程间通信,又叫命名管道(named pipe)。
(6)套接字socket:用于进程间的网络通信,也可用于在一台宿主机上进程之间的非网络通信。
(7)符号链接:指向另一个文件
每次一个字符的I/O:
int getc(FILE *fp); // 可被实现为宏
int fgetc(FILE *fp);
int getchar(void); // 等价于getc(stdin)
若成功则返回下一个字符(unsigned char转换为int);到达结尾或出错返回EOF(负值,一般为-1)。
int putc(int c, FILE *fp);
int fputc(int c, FILE *fp);
int putchar(int c);
每次一行I/O:
char *fgets(char *buf, int n, FILE *fp);
char *gets(char *buf); // 容易造成缓冲区溢出;不将换行符存入缓冲区,会删除
若成功则返回buf;到达文件结尾或出错返回NULL。
int fputs(const char *str, FILE *fp); // null符终止字符串
int puts(const char *str);
若成功则返回非负值,出错返回EOF
二进制I/O:
size_t fread(void *buffer, size_t size, size_t count, FILE *stream); // 从文件流中读数据,最多读count个元素,每个元素size字节
size_t fwrite(const void *buffer, size_t size, size_t count, FILE *stream); // 向文件写入一个数据块,最多写count个元素,每个元素size字节
若成功返回实际读写的数据项个数,否则返回0。
定位流:
long ftell(FILE *fp); // 成功返回当前文件位置指示;出错返回-1L
int fseek(FILE *fp, long offset, int whence); // 成功返回0,出错返回非0值。 whence:SEEK_SET,SEEK_CUR,SEEK_END
void rewind(FILE *fp);
格式化I/O:
int printf(const char *format,...);
int fprintf(FILE *stream, const char *format, [argument]); // 两个函数返回值,成功返回输出字符数;出错返回负值
int sprintf(char *buffer, const char*format, [argument]...);
int snprintf(char *buffer, size_t size, const char*format,); // 两个函数返回值,成功返回存如数组的字符数;出错返回负值
文件I/O的更多相关文章
- Mapreduce的文件和hbase共同输入
Mapreduce的文件和hbase共同输入 package duogemap; import java.io.IOException; import org.apache.hadoop.co ...
- mapreduce多文件输出的两方法
mapreduce多文件输出的两方法 package duogemap; import java.io.IOException; import org.apache.hadoop.conf ...
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- SQL Server 大数据搬迁之文件组备份还原实战
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搬迁步骤(Procedure) 搬迁脚本(SQL Codes) ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- 【小程序分享篇 一 】开发了个JAVA小程序, 用于清除内存卡或者U盘里的垃圾文件非常有用
有一种场景, 手机内存卡空间被用光了,但又不知道哪个文件占用了太大,一个个文件夹去找又太麻烦,所以我开发了个小程序把手机所有文件(包括路径下所有层次子文件夹下的文件)进行一个排序,这样你就可以找出哪个 ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
随机推荐
- 用wordpress制作网站的总结
在没有自己的网站的时候很像拥有一个属于自己的网站,可以说是自己的一个愿望吧.但是当我真正的运行起来了之后觉得没有多么的兴奋,自己也折腾了几天wordpress,从买域名空间,到安装WP,遇到了一些问题 ...
- JMS【二】--ActiveMQ简单介绍以及安装
现实的企业中,对于消息通信的应用一直都非常的火热,而且在J2EE的企业应用中扮演着特殊的角色,所以对于它研究是非常有必要的. 上篇博文JMS[一]--JMS基本概念,我们介绍了消息通信的规范JMS,我 ...
- 转 cocos2d-x 优化(纹理渲染优化、资源缓存、内存优化)
概述 包括以下5种优化:引擎底层优化.纹理优化.渲染优化.资源缓存.内存优化 引擎优化 2.0版本比1.0版本在算法上有所优化,效率更高.2.0版本使用OpenGl ES 2.0图形库,1.0版本 ...
- 数据库分库分表(sharding)
地址: http://blog.csdn.net/column/details/sharding.html
- HttpServletRequest学习
package cn.request; import java.io.IOException; import java.io.PrintWriter; import java.io.Unsupport ...
- SQL VIEW 使用语法
之前一直都不知道VIEW有什么作用,写程序的时候也很少遇到过,复习SQL语句的时候碰到了,就记录下来吧. 什么是视图? 在 SQL 中,视图是基于 SQL 语句的结果集的可视化的表. 视图包含行和列, ...
- 教你如何拔取百度地图POI兴趣点
教你如何拔取百度地图POI兴趣点 通过聚合数据提供的接口,获取百度地图的POI兴趣点,并存储至数据库中. 实现: 1.聚合数据百度POI接口说明 调用聚合数据,首先得注册聚合.聚合数据提供的百度地 ...
- [转载] Docker网络原则入门:EXPOSE,-p,-P,-link
原文: http://dockone.io/article/455 如果你已经构建了一些多容器的应用程序,那么肯定需要定义一些网络规则来设置容器间的通信.有多种方式可以实现:可以通过--expose参 ...
- Python学习笔记10—几个名词概念
循环(loop),指的是在满足条件的情况下,重复执行同一段代码.比如,while 语句. 迭代(iterate),指的是按照某种顺序逐个访问列表中的每一项.比如,for 语句. 递归(recursio ...
- 【Todo】单例模式各种实现方式及并发安全
Java 40道面试题不错:http://www.tuicool.com/articles/VRVFZb 其中有一道题目: 单例模式的线程安全性 老生常谈的问题了,首先要说的是单例模式的线程安全意味着 ...