在Linux中文件总共被分成了7种,他们分别是:
(1)普通文件(regular) :存在于外部存储器中,用于存储普通数据。
(2)目录文件(directory) :用于存放目录项,是文件系统管理的重要文件类型。
(3)管道文件(pipe) :一种用于进程间通信的特殊文件,也称为命名管道FIFO。
(4)套接字文件(socket) :一种用于网络间通信的特殊文件。
(5)链接文件(link) :用于间接访问另外-一个目标文件,相当于Windows快捷方式。
(6)字符设备文件(character) :字符设备在应用层的访问接口。
(7)块设备文件(block):块设备在应用层的访问接口。
(1)打开文件fopen()
函数原型:
FILE *fopen(const char *path,const char *mode)
参数说明:
path:即将要打开的文件
mode:"r":以只读方式打开文件,要求文件必须存在
"r+":以读写方式打开文件,要求文件必须存在
"w":以只写方式打开文件,文件如果不存在将会创建新文件,如果存在将会清空其内容
"w+":以读写方式打开文件,文件如果不存在将会创建新文件,如果存在将会清空其内容
"a":以只写方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量自动定位到文件末尾(即以追加方式写数据) "a+":以读写方式打开文件,文件如果不存在将会创建新文件,且文件位置偏移量自动定位到文件末尾(即以追加方式写数据)
返回值:
成功:文件指针
失败:NULL
(2)关闭文件fclose()
函数原型:
int fclose(FILE *fp)
参数说明:
fp:即将要关闭的文件
返回值:
成功:0
失败:EOF
(3)从文件中读取一个字符
函数原型:
int fgetc(FILE *stream)
int getc(FILE *stream)
int getchar(void)
参数说明:
stream:文件指针
返回值:
成功:读取到的字符
失败:EOF
(4)向文件中写入一个字符
函数原型:
int fputc(int c,FILE *stream)
int putc(int c,FILE *stream)
int putchar(int c)
参数说明:
stream:文件指针
c:要写入的字符
返回值:
成功:写入的字符
失败:EOF
(5)feof()和ferror()
函数原型:
int feof(FILE *stream)
int ferror(FILE*stream)
参数说明:
stream:文件指针
返回值:
feof:如果文件已达末尾则返回真,否则返回假
ferror:如果文件遇到错误则返回真,否则返回假
(6)从文件中读取字符串
函数原型:
char *fgets(char *s,int size,FILE *stream)
char *gets(char *s)
参数说明:
s:自定义缓冲区指针
size:自定义缓冲区大小
stream:文件指针
返回值:
成功:自定义缓冲区指针s
失败:NULL
备注:
gets()默认从文件stdin读取数据当返回NULL时,文件stream可能已达末尾,或者遇到错误
(7)向文件中写入字符串
函数原型:
int fputs(const char *s,FILE *stream)
int puts(const char *s)
参数说明:
s:自定义缓冲区指针
stream:文件指针
返回值:
成功:非负整数
失败:EOF
备注:
puts()默认将数据写入文件stdout
(8)读写操作fread()和fwrite()
函数原型:
size_t fread(void *ptr,size_t size,size_t nmemb,FILE *stream)
size_t fwrite(void *ptr,size_t size,size_t nmemb,FILE *stream)
参数说明:
ptr:自定义缓冲区指针
size:数据块大小
nmemb:数据块个数
stream:文件指针
返回值:
成功:读取或写入的数据块个数,等于nmemb
失败:读取或写入的数据块个数,小于nmemb或等于0
备注:
当返回小于nmemb时,文件stream可能已达末尾,或遇到错误
(9)设置文件当前位置偏移量
函数原型:
int fseek(FILE *stream,long offset,int whence)
参数说明:
stream:文件指针
offset:新文件偏移量相对基准点的偏移
whence(基准点):SEEK_SET:文件开头处
SEEK_CUR:当前位置
SEEK_END:文件末尾处
返回值:
成功:0失败:-1
(10)获取指定文件的当前位置偏移量
函数原型:
long ftell(FILE *stream)
参数说明:
stream:文件指针
返回值:
成功:当前文件位置偏移量
失败:-1
(11)将指定文件的当前位置偏移量设置到文件开头处
函数原型:
void rewind(FILE *stream)
参数说明:
stream:文件指针
(1)打开文件open()
函数原型:
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
(2)关闭文件close()
函数原型:
int close(int fd)
参数说明:
fd:文件描述符
返回值:
成功:0
失败:-1
备注:
重复关闭一个已经关闭了的文件或者尚未打开的文件是安全的
(3)文件的读写read()和write()
函数原型:
ssize_t read(int fd,void *buf,size_t count)
ssize_t write(int fd,const void *buf,size_t count)
参数说明:
fd:文件描述符
buf:指向存放读取数据的缓冲区,或者即将要写入的数据
count:想要读取或写入的字节数
返回值:
成功:实际读取或写入的字节数
失败:-1
备注:
实际读到或写入的字节数小于等于count
(4)调整文件位置偏移量lseek()
函数原型:
off_t lseek(int fd,off_t offset,int whence)
参数说明:
fd:文件描述符
offset:新位置偏移量相对基准点的偏移
whence:SEEK_SET,文件开头处
SEEK_CUR,当前位置
SEEK_END,文件末尾处
返回值:
成功:新文件位置偏移量
失败:-1
(5)复制文件描述符
函数原型:
int dup(int oldfd)
int dup2(int oldfd,int newfd)
参数说明:
oldfd:要复制的文件描述符
newfd:指定的新文件描述符
返回值:
成功:新的文件描述符
失败:-1
(1)打开目录
函数原型:
DIR *opendir(const char *name)
参数说明:
name:目录名
返回值:
成功:目录指针失败:NULL
(2)读取目录
函数原型:
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]; //文件名
};
(1)获取文件信息
函数原型:
int stat(const char *path,struct stat *buf)
int fstat(int fd,struct stat *buf)
int lstat(const char *path,struct stat *buf)
参数说明:
path:文件路径
fd:文件描述符
buf:属性结构体
返回值:
成功:0
失败:NULL
属性结构体如下所示:
struct stat {
dev_t st_dev;//普通文件所在存储器的设备号
mode_t st_mode; // 文件类型、文件权限
ino_t st_ino;//文件索引号
nlink_t st_nlink;//引用计数
uid_t st_uid;//文件所有者的UID
gid_t st_gid;//文件所属组的GID
dev_t st_rdev;//特殊文件的设备号
off_t st_size;//文件大小
blkcnt_t st_blocks; // 文件所占数据块数目
time_t st_atime;//最近访问时间
time_t st_mtime; // 最近修改时间
time_t st_ctime;//最近属性更改时间
blksize_t st_blksize; // 写数据块建议值
};
该结构体中有很多成员的含义和作用是一目了然的,比如:
- 文件索引号: st_ino, 实质上是一个无符号整形数据,用来唯一确定分区中的文件。
- 引用计数: st_nlink, 记录该文件的名字(或叫硬链接)总数,文件的别名可以用命令link或者函数link()来创建。当一个文件的引用计数st_ nlink为零时,系统将会释放清空该文件锁占用的一切系统资源。
- 文件所有者UID和所属组GID。
- 文件的大小。这个属性对只对普通文件有效。
- 文件所占数据块数目st_ blocks, 表明该文件实际占用存储器空间。一个数据块一般为512字节。
- st_atime、st_mtime和st_ctime都是一个文件的时间戳,st_atime代表文件被访问了但是没有被修改的最近时间,st_mtime代表文件内容被修改的最近时间,st_ctime则代表了文件属性更改的最近时间。文件的时间戳对于某些场合来讲是至关重要的属性,比如工程管理器make,他的工作原理就完全基于文件的时间戳上,判断文件的被修改时间,决定其是否参与编译。
- st_blksize 是所谓的“写数据块”的建议值,因为当应用程序频繁地往存储器写入小块数据的时候,可能会导致效率的低下。
(2)分离主次设备号
函数原型:
int major(dev_t dev)
int minor(dev_t dev)
参数说明:
dev:文件的设备号属性,来自stat结构体中的st_dev或者st_rdev
返回值:
成功:major返回主设备号,minor返回次设备号
失败:无
(3)文件类型和权限
属性成员中的st_ mode 里面包含了文件类型和权限,st_ mode 实质上是-一个无符号16位短整型数,各个位域所包含的含义如下:
下面的表格是st_ mode 的详细信息:
(4)判断文件类型的宏
(5)判断文件是否存在
函数原型:
int access(const char *filename, int mode);
参数定义:
filename:可以填写文件夹路径或者文件路径
mode:0 (F_OK) 只判断是否存在
2 (R_OK) 判断写入权限
4 (W_OK) 判断读取权限
6 (X_OK) 判断执行权限
用于判断文件夹是否存在的时候,mode取0,判断文件是否存在的时候,mode可以取0、2、4、6。
返回值:
成功:若存在或者具有权限,返回值为0
失败:不存在或者无权限,返回值为-1。