文件 io 篇
1. open 文件打开
函数原形
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char *pathname, int flags, mode_t mode);
//功能: 打开或创建文件
参数1:打开的文件的路径 包括文件名 路径:可以是绝对路径 也可以是相对路径
参数2:打开文件的方式
参数3:对新文件的访问权限 可有可无 如果参数2是O_CREAT 则参数3生效
返回值:成功返回文件描述符 失败-1
参数
- pathname 打开的文件的路径(包含路径:绝对路径或者相对路径)
- flags 打开文件的方式
- mode 对新文件的访问权限,可有可无。如果参数2是O_CREAT,则参数3生效
- 返回值 成功则返回文件描述符,失败则返回-1
flags参数类型
-
O_RDONLY 只读打开
-
O_WRONLY 只写打开
-
O_RDWR 读、写打开
-
大多数实现将 O_RDONLY 定义为 0 ,O_WRONLY定义为 1 ,O_RDWR定义为 2
-
O_EXEC 只执行打开
-
O_SEARCH 只搜索打开
上述 5 个常量中必须指定且只能指定一个。下列常量则是可选的。
- O_APPEND 每次写时都追加到文件的尾端。
- O_CREAT 如果文件不存在则创建,如果文件存在则打开。使用此选项时,open函数需同时说明第3个参数mode,用mode指定该新文件的访问权限位。
- O_EXCL 测试文件是否存在,如果同时指定O_CREAT,而文件已经存在,则open返回错误信息。用此可以此时一个文件是否存在,如若不存在,则创建此文件。
- O_DIRECTORY 如果path引用的不是目录,则出错。
- O_NOCTTY 如果path引用的是终端设备,则不将该设备分配作为此进程的控制终端。
- O_NOFOLLOW 如果path引用的是一个符号链接,则出错。
- O_NONBLOCK 如果path引用的是一个FIFO、一个块特殊文件或一个字符特殊文件,则此选项为文件的本次打开操作和后续的I/O操作设置为非阻塞方式。
- O_CLOEXEC 把FD_CLOEXEC常量设置为文件描述符标志。
- O_SYNC 使每次write等待物理I/O操作完成,包括由该write操作引起的文件属性更新所需的 I/O。
- O_TRUNC 如果此文件存在,而且为只写或读-写成功打开,则将其长度截断为0。(清空文件内容)
2. 文件 tips
文件描述符
分配规则:当前尚未分配的最小的非负整数
- 标准输入 ——键盘 0
- 标准输出 ——显示器 1
- 标准错误输出 ——显示器 2
文件属性 | 文件所有者 | 文件所属组 | 文件大小 | 文件创建时间 | 文件名 | |||
---|---|---|---|---|---|---|---|---|
-rw-rw-r– | 1 | linux | linux | 90 | Aug | 4 | 01:22 | create.c |
文件类型
例:drwxrwxr-x
第一个字符代表文件类型
d 目录文件
目录文件 directory file。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件。进程必须使用函数才能更改目录。
- 普通文件
普通文件 regular file。这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。
c 字符设备文件
字符特殊文件 character special file。这种类型的文件提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
l 链接文件
符号链接 symbolic link。这种类型的文件指向另一个文件。
b 块设备文件
快特殊文件 block special file。这种类型的文件提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
s 套接字文件
套接字 socket。这种类型的文件用于进程间的网络通信。套接字也可用于在另一台宿主机上进程之间的非网络通信。
p 管道文件
FIFO。这种类型的文件用于进程间通信,有时也称为命名管道(named pipe)。
3. close 文件关闭
函数原型
#include <unistd.h>
int close(int fd);
//功能:关闭文件fd
参数
- 返回值 成功则返回0,失败则返回-1
4. write 写入
函数原形
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
//功能:将数据写入文件
参数
- fd 文件描述符
- buf 数据首地址
- count 写入数据的长度(字节)
- 返回值 成功则返回实际写入的字节数,失败则返回-1。(ssize_t 为有符号整型)
5. read 读取
函数原形
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
//功能:从文件中读数据
参数
- fd 文件描述符
- buf 数据首地址
- count 写入数据的长度(字节)
- 返回值 成功则返回实际写入的字节数,失败则返回-1。(ssize_t 为有符号整型)
6.lseek 设置文件偏移量
函数原型
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
//功能:为一个打开文件设置偏移量(文件位置指针定位)
参数
- fd 文件描述符
- offset 偏移量(字节)
- whence 偏移量参照
- 返回值 成功则返回文件位置指针相对于文件起始位置的偏移,失败则返回-1
whence参数类型
- SEEK_SET 将该文件的偏移量设置为距文件开始处offse个字节
- SEEK_CUR 将该文件的偏移量设置为其当前值加offset个字节,offset可为正或负
- SEEK_END 将该文件的偏移值设置为文件长度加offset个字节,offset可为正或负
文件和目录篇
1. opendir 打开目录流
函数原型
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
//功能:打开目录流
参数
- name 要打开的目录,包括路径
- 返回值 成功则返回目录流指针,失败则返回NULL
2. closedir 关闭目录
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
//功能:关闭目录
3. readdir 读取目录
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
//功能:读取目录
参数
- dirp 目录流指针
- 返回值 成功则返回struct dirent类型指针,到达结尾或失败则返回NULL
struct dirent
struct dirent
{
ino_t d_ino; /* inode number */inode编号 文件编号
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all file system types */
char d_name[256]; /* filename */ 文件名
};
4. stat 返回文件信息
函数原型
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);//stat("a.txt",&s);
//功能:获取path文件属性 将其保存到buf 不能获取链接文件属性
参数
- path: 文件名(含路径)
- buf: 将参数path所指的文件状态,,复制到参数buf所指的结构中。buf是一个 stat 结构地址,stat 函数会在调用时自动填充该结构的内容
- 返回值:成功则返回0,失败则返回-1
struct stat 结构定义
//定义于 /usr/include/sys/stat.h 文件中
struct stat
{
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */ inode 文件编号
mode_t st_mode; /* protection */文件操作权限 文件类型
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */\\p00
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */ 文件大小
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
*** tips***
stat用来判断没有打开的文件,我们使用最多的属性是st_mode。通过此属性我们可以判断给定的文件是一个普通文件还是一个目录、链接等等。可以使用下面几个宏来判断。
宏 | 文件类型(符合返回真,否则返回假) |
---|---|
S_ISLNK(st_mode) | 判断是否是一个连接 |
S_ISREG(st_mode) | 判断是否是一个常规文件 |
S_ISDIR(st_mode) | 判断是否是一个目录 |
S_ISCHR(st_mode) | 判断是否是一个字符设备 |
S_ISBLK(st_mode) | 判断是否是一个块设备 |
S_ISFIFO(st_mode) | 判断是否是一个FIFO文件 |
S_ISSOCK(st_mode) | 判断是否是一个SOCKET文件 |