1.在 Linux 中,文件总共被分成了 7 种,他们分别是:
1,普通文件 (regular) :存在于外部存储器中,用于存储普通数据。
2, 目录文件 (directory) :用于存放目录项,是文件系统管理的重要文件类型。
3,管道文件 (pipe) :一种用于进程间通信的特殊文件,也称为命名管道 FIFO。
4,套接字文件 (socket) :一种用于网络间通信的特殊文件。
5,链接文件 (link) :用于间接访问另外一个目标文件,相当于 Windows 快捷方式。
6,字符设备文件 (character) :字符设备在应用层的访问接口。
7,块设备文件 (block) :块设备在应用层的访问接口。
功能 | 打开一个指定的文件并获得文件描述符,或者创建一个新文件 | ||
头文件 | #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 | O_RDONLY:只读方式打开文件 | 这三个参数互斥 | |
O_WRONLY:只写方式打开文件 | |||
O_RDWR:读写方式打开文件 | |||
O_CREAT:如果文件不存在,则创建该文件。 | |||
O_EXCL:如果使用 O_CREAT 选项且文件存在,则返回错误消息。 | |||
O_NOCTTY:如果文件为终端,那么终端不可以作为调用 open()系统调 用的那个进程的控制终端。 | |||
O_TRUNC:如文件已经存在,则删除文件中原有数据。 | |||
O_APPEND:以追加方式打开文件。 | |||
mode | 如果文件被新建,指定其权限为 mode (八进制表示法) | ||
返回值 | 成功 | 大于等于 0 的整数 (即文件描述符) | |
失败 | - 1 | ||
备注 | 无 |
功能 | 关闭文件并释放相应资源 | |
头文件 | #include <unistd.h> | |
原型 | int close(int fd); | |
参数 | fd:即将要关闭的文件的描述符 | |
返回值 | 成功 | 0 |
失败 | - 1 | |
备注 | 重复关闭一个已经关闭了的文件或者尚未打开的文件是安全的。 |
功能 | 从指定文件中读取数据 | |
头文件 | #include <unistd.h> | |
原型 | ssize_t read(int fd, void *buf, size_t count); | |
参数 | fd:从文件fd 中读数据 | |
buf:指向存放读到的数据的缓冲区 | ||
count:想要从文件 fd 中读取的字节数 | ||
返回值 | 成功 | 实际读到的字节数 |
失败 | - 1 | |
备注 | 实际读到的字节数小于等于 count |
功能 | 将数据写入指定的文件 | |
头文件 | #include <unistd h> | |
原型 | ssize_t write(int fd, const void *buf, size_t count); | |
参数 | fd:将数据写入到文件 fd 中 | |
buf:指向即将要写入的数据 | ||
count:要写入的字节数 | ||
返回值 | 成功 | 实际写入的字节数 |
失败 | - 1 | |
备注 | 实际写入的字节数小于等于 count |
功能 | 调整文件位置偏移量 | ||
头文件 | #include <sys/types.h> #include <unistd.h> | ||
原型 | off_t lseek(int fd, off_t offset, int whence); | ||
参数 | fd:要调整位置偏移量的文件的描述符 | ||
offset:新位置偏移量相对基准点的偏移 | |||
whence:基准点 | SEEK_SET:文件开头处 | ||
SEEK_CUR:当前位置 | |||
SEEK_END:文件末尾处 | |||
返回值 | 成功 | 新文件位置偏移量 | |
失败 | - 1 | ||
备注 | 无 |
功能 | 复制文件描述符 | |
头文件 | #include <unistd.h> | |
原型 | int dup(int oldfd); int dup2(int oldfd, int newfd); | |
参数 | oldfd:要复制的文件描述符 | |
newfd:指定的新文件描述符 | ||
返回值 | 成功 | 新的文件描述符 |
失败 | - 1 | |
备注 | 无 |
功能 | 文件控制 | |
头文件 | #include <sys/ioctl.h> | |
原型 | int ioctl(int d, int request, ...); | |
参数 | d:要控制的文件描述符 | |
request:针对不同文件的各种控制命令字 | ||
变参:根据不同的命令字而不同 | ||
返回值 | 成功 | 一般情况下是 0 ,但有些特定的请求将返回非负整数。 |
失败 | - 1 | |
备注 | 无 |
功能 | 文件控制 | |
头文件 | #include <unistd.h> #include <fcntl.h> | |
原型 | int fcntl(int fd, int cmd, .../* arg */ ); | |
参数 | fd:要控制的文件描述符 | |
cmd:控制命令字 | ||
变参:根据不同的命令字而不同 | ||
返回值 | 成功 | 根据不同的 cmd ,返回值不同 |
失败 | - 1 | |
备注 | 无 |
功能 | 内存映射 | |
头文件 | #include <sys/mman.h> | |
原型 | void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); | |
参数 | addr: | 映射内存的起始地址。 如果该参数为 NULL, 则系统将会自动寻找一个合适的起始地址,一 般都使用这个值。 如果该参数不为 NULL,则系统会以此为依据来找到一个合适的起始地 址。在 Linux 中,映射后的内存起始地址必须是页地址的整数倍。 |
length: | 映射内存大小。 | |
prot: | 映射内存的保护权限。 PROT_EXEC : 可执行。 PROT_READ : 可读。 PROT_WRITE : 可写。 PROT_NONE: 不可访问。 | |
flags: | 当有多个进程同时映射了这块内存时,该参数可以决定在某一个进程 内使映射内存的数据发生变更是否影响其他进程,也可以决定是否影 响其对应的文件数据。 以下两个选项互斥: MAP_SHARED : 所有的同时映射了这块内存的进程对数据的变更均 可见,而且数据的变更会直接同步到对应的文件 (有时可能还需要调 用 msync( )或者 munmap( )才会真正起作用) 。 MAP_PRIVATE : 与 MAP_SHARED 相反,映射了这块内存的进程对数 据的变更对别的进程不可见,也不会影响其对应的文件数据。 以下选项可以位或累加: MAP_32BIT :在早期的 64 位 x86 处理器上,设置这个选项可以将线程 的栈空间设置在最低的 2GB 空间附近,以便于上下文切换时得到更好 的表现性能,但现代的64 位 x86 处理器本身已经解决了这个问题, 因此这个选项已经被弃用了。 MAP_ANON :等同于 MAP_ANONYMOUS,已弃用。 MAP_ANONYMOUS :匿名映射。该选项使得该映射内存不与任何文件 关联,一般来讲参数 fd和 offset 会被忽略 (但是可移植性程序需要将 fd 设置为-1) 。另外,这个选项必须跟 MAP_SHARED 一起使用。 |
功能 | 获取指定文件的文件指针 | |
头文件 | #include <stdio.h> | |
原型 | FILE *fopen(const char *path, const char *mode); | |
参数 | path:即将要打开的文件 | |
mode | “r” : 以只读方式打开文件,要求文件必须存在。 | |
“r+” : 以读写方式打开文件,要求文件必须存在。 | ||
“w” : 以只写方式打开文件,文件如果不存在将会创建新文件,如果存 在将会将其内容清空。 | ||
“w+” : 以读写方式打开文件,文件如果不存在将会创建新文件,如果存 在将会将其内容清空。 | ||
“a” : 以只写方式打开文件,文件如果不存在将会创建新文件,且文件位 置偏移量被自动定位到文件末尾 (即以追加方式写数据) 。 | ||
“a+” : 以读写方式打开文件,文件如果不存在将会创建新文件,且文件 位置偏移量被自动定位到文件末尾 (即以追加方式写数据) 。 | ||
返回值 | 成功 | 文件指针 |
失败 | NULL | |
备注 | 无 |
文件指针和文件描述符的关系如下图所示:
功能 | 关闭指定的文件并释放其资源 | |
头文件 | #include <stdio.h> | |
原型 | int fclose(FILE *fp); | |
参数 | fp:即将要关闭的文件 | |
返回值 | 成功 | 0 |
失败 | EOF | |
备注 | 无 |
功能 | 获取指定文件的一个字符 | |
头文件 | #include <stdio.h> | |
原型 | int fgetc(FILE *stream); int getc(FILE *stream); int getchar(void); | |
参数 | stream:文件指针 | |
返回值 | 成功 | 读取到的字符 |
失败 | EOF | |
备注 | 当返回 EOF 时,文件 stream 可能已达末尾,或者遇到错误 |
功能 | 讲一个字符写入一个指定的文件 | |
头文件 | #include <stdio.h> | |
原型 | int fputc(int c, FILE *stream); int putc(int c, FILE *stream); int putchar(int c); | |
参数 | c:要写入的字符 | |
stream:写入的文件指针 | ||
返回值 | 成功 | 写入到的字符 |
失败 | EOF | |
备注 | 无 |
功能 | feof():判断一个文件是否到达文件末尾 ferror():判断一个文件是否遇到了某种错误 | |
头文件 | #include <sys/ioctl.h> | |
原型 | int feof(FILE *stream); int ferror(FILE *stream); | |
参数 | stream:进行判断的文件指针 | |
返回值 | feof | 如果文件已达末尾则返回真,否则返回假 |
ferror | 如果文件遇到错误则返回真,否则返回假 | |
备注 | 无 |
功能 | 从指定文件读取最多一行数据 | |
头文件 | #include <sys/ioctl.h> | |
原型 | char *fgets(char *s, int size, FILE *stream); char *gets(char *s); | |
参数 | s: 自定义缓冲区指针 | |
size: 自定义缓冲区大小 | ||
stream:即将被读取数据的文件指针 | ||
返回值 | 成功 | 自定义缓冲区指针 s |
失败 | NULL | |
备注 | 1,gets( )缺省从文件 stdin 读入数据 2,当返回 NULL 时,文件 stream 可能已达末尾,或者遇到错误 |
功能 | 将数据写入指定的文件 | |
头文件 | #include <sys/ioctl.h> | |
原型 | int fputs(const char *s, FILE *stream); int puts(const char *s); | |
参数 | s: 自定义缓冲区指针 | |
stream:即将被写入数据的文件指针 | ||
返回值 | 成功 | 非负整数 |
失败 | EOF | |
备注 | puts( )缺省将数据写入文件 stdout |
功能 | 从指定文件读取若干个数据块 | |
头文件 | #include <sys/ioctl.h> | |
原型 | size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); | |
参数 | ptr: 自定义缓冲区指针 | |
size:数据块大小 | ||
nmemb:数据块个数 | ||
stream:即将被读取数据的文件指针 | ||
返回值 | 成功 | 读取的数据块个数,等于 nmemb |
失败 | 读取的数据块个数,小于 nmemb 或等于 0 | |
备注 | 当返回小与nmemb 时,文件 stream 可能已达末尾,或者遇到错误 |
功能 | 将若干块数据写入指定的文件 | |
头文件 | #include <sys/ioctl.h> | |
原型 | size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream); | |
参数 | ptr: 自定义缓冲区指针 | |
size:数据块大小 | ||
nmemb:数据块个数 | ||
stream:即将被写入数据的文件指针 | ||
返回值 | 成功 | 写入的数据块个数,等于 sinmembze |
失败 | 写入的数据块个数,小于 nmemb 或等于 0 | |
备注 | 无 |
功能 | 设置指定文件的当前位置偏移量 | ||
头文件 | #include <sys/ioctl.h> | ||
原型 | int fseek(FILE *stream, long offset, int whence); | ||
参数 | stream:需要设置位置偏移量的文件指针 | ||
offset:新位置偏移量相对基准点的偏移 | |||
whence:基准点 | SEEK_SET:文件开头处 | ||
SEEK_CUR:当前位置 | |||
SEEK_END:文件末尾处 | |||
返回值 | 成功 | 0 | |
失败 | - 1 | ||
备注 | 无 |
功能 | 获取指定文件的当前位置偏移量 | |
头文件 | #include <sys/ioctl.h> | |
原型 | long ftell(FILE *stream); | |
参数 | stream:需要返回当前文件位置偏移量的文件指针 | |
返回值 | 成功 | 当前文件位置偏移量 |
失败 | - 1 | |
备注 | 无 |
功能 | 将指定文件的当前位置偏移量设置到文件开头处 |
头文件 | #include <sys/ioctl.h> |
原型 | void rewind(FILE *stream); |
参数 | stream:需要设置位置偏移量的文件指针 |
返回值 | 无 |
备注 | 该函数的功能是将文件 strean 的位置偏移量置位到文件开头处。 |
功能 | 将格式化数据写入指定的文件或者内存 | |
头文件 | #include <stdio.h> | |
原型 | int fprintf(FILE *restrict stream, const char *restrict format, ...); int printf(const char *restrict format, ...); int snprintf(char *restrict s, size_t n,const char *restrict format, ...); int sprintf(char *restrict s, const char *restrict format, ...); | |
参数 | stream:写入数据的文件指针 | |
format:格式控制串 | ||
s:写入数据的自定义缓冲区 | ||
n: 自定义缓冲区的大小 | ||
返回值 | 成功 | 成功写入的字节数 |
失败 | - 1 | |
备注 | 无 |
功能 | 从指定的文件或者内存中读取格式化数据 | |
头文件 | #include <stdio.h> | |
原型 | int fscanf(FILE *restrict stream, const char *restrict format, ... ); int scanf(const char *restrict format, ... ); int sscanf(const char *restrict s, const char *restrict format, ... ); | |
参数 | stream:读出数据的文件指针 | |
format:格式控制串 | ||
s:读出数据的自定义缓冲区 | ||
返回值 | 成功 | 正确匹配且赋值的数据个数 |
失败 | EOF | |
备注 | 无 |
2. 目录检索
功能 | 打开目录以获得目录指针 | |
头文件 | #include <sys/types.h> #include <dirent.h> | |
原型 | DIR *opendir(const char *name); | |
参数 | name: 目录名 | |
返回值 | 成功 | 目录指针 |
失败 | NULL | |
备注 | 无 |
功能 | 读取目录项 | |
头文件 | #include <dirent.h> | |
原型 | struct dirent *readdir(DIR *dirp); | |
参数 | dirp:读出目录项的目录指针 | |
返回值 | 成功 | 目录项指针 |
失败 | NULL | |
备注 | 无 |
从目录中读到的所谓目录项,是一个这样的结构体:
struct dirent
{
ino_t d_ino; // 文件索引号
off_t d_off; // 目录项偏移量
unsigned short d_reclen; // 该目录项大小
unsigned char d_type; // 文件类型
char d_name[256]; // 文件名
};