[IO系统]02 用户态的文件IO操作

来源:互联网 发布:直线插补算法 编辑:程序博客网 时间:2024/06/05 23:01

在工作中,经常会进行文件创建、更新、删除等操作,但是作为存储领域技术人员,我们又对其过程了解多少哪。本系列文章将会对文件操作进行系统的分析和梳理,与大家共同进步。

先来了解用户态的文件操作的常用函数。

 

1. “缓冲”文件系统 – 用户态带缓存(与文件系统没有关系)

缓冲文件系统的特点是:在内存开辟一个“缓冲区”,为程序中的每一个文件使用,当执行读文件的操作时,从磁盘文件将数据先读入内存“缓冲区”, 装满后再从内存“缓冲区”依此读入接收的变量。执行写文件的操作时,先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。由此可以看出,内存 “缓冲区”的大小,影响着实际操作外存的次数,内存“缓冲区”越大,则操作外存的次数就少,执行速度就快、效率高。一般来说,文件“缓冲区”的大小随机器而定。

fopen, fclose, fread,fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等

2.“非缓冲”文件系统 – 用户态不带缓存(与文件系统没有关系)

缓冲文件系统是借助文件结构体指针(FILE)来对文件进行管理,通过文件指针来对文件进行访问,既可以读写字符、字符串、格式化数据,也可以读写二进制数据(openmode:r和ra)。非缓冲文件系统依赖于操作系统,通过操作系统的功能对文件进行读写,是系统级的输入输出,它不设文件结构体指针(但是有文件描述符),只能读写二进制文件,但效率高、速度快,由于ANSI标准不再包括非缓冲文件系统,因此建议大家最好不要选择它,只作简单介绍。

open, close, read,write, getc, getchar, putc, putchar 等

 

1.1   典型函数

用户态的文件操作,主要分为两类。

POSIX文件接口操作:

# 打开文件,flags 必须包含O_RDONLY, O_WRONLY, or O_RDWR中的任何一个

int open(const char *pathname, intflags);

# 打开文件,mode只是在flags中包含O_CREAT时才有效

int open(const char *pathname, intflags, mode_t mode);

# 定位文件位置

off_t lseek(int fd, off_t offset,int whence);

# 读取文件内容,文件位置会随读取的字节数移动

ssize_t read(int fildes, void *buf,size_t nbyte);

# 写入文件内容,文件位置会随读取的字节数移动

ssize_t write(int fildes, const void*buf, size_t nbyte);

# 关闭文件

int close(int fd);

# 文件同步

int fsync(int fd);

# 预置文件大小

int ftruncate(int fd, off_t length);

# 获得文件的基本信息

int fstat(int fd, struct stat *buf);

 

C99标准文件操作:

# 文件打开操作

FILE *fopen(const char *path, constchar *mode);

#文件定位操作

int fseek(FILE *stream, long offset,int whence);

# 查询当前光标位置

long ftell(FILE *stream);

# 将光标位置移动到文件头部

void rewind(FILE *stream);

# 文件读操作

size_t fread(void *ptr, size_t size,size_t nmemb, FILE *stream);

# 文件写操作

size_t fwrite(const void *ptr,size_t size, size_t nmemb,FILE *stream);

# 判断文件是否已经读完

int feof(FILE *stream);

# 按格式读取文件流,还有scanf家族的其他函数,比如sscanf可以读取字节流

int fscanf(FILE *stream, const char*format, ...);

# 按格式将内容写入到文件中,还有sprintf,vprintf等等

int fprintf(FILE *stream, const char*format, ...);

# 直接将不定参数写入到文件,相对应的还有读取函

int vfprintf(FILE *stream, constchar *format, va_list ap);   

# 强迫将缓冲区内的数据写回参数stream 指定的文件中.

int fflush(FILE *stream);

# 从文件结构体指针stream中读取数据,每次读取一行,读到换行符或EOF时停止

char *fgets(char *s, int size, FILE*stream);       NT                                     

# 取得参数stream指定的文件流所使用的文件描述符

int fileno(FILE *stream);

# 向指定的文件写入一个字符串

int fputs(const char *s, FILE*stream);

 

两者区别:

1. 前者属于低级IO操作,后者是高级IO操作。

2. 前者返回一个文件描述符,后者返回一个文件指针。

3. 前者无用户态缓冲,后者有用户态缓冲。

4. 前者与read, write 等配合使用, 后者与 fread, fwrite等配合使用。

5. 后者是在前者的基础上扩充而来的,在大多数情况下,用后者。 

其他的文件操作:

    文件权限类操作

# 删除指定路径的文件

int remove(const char *pathname);

# 重命名指定文件

int rename(const char *old, constchar *new);

#修改文件的存取时间

int utime(const char *path, conststruct utimbuf *times);

# 获得文件的详细信息

int stat(const char *restrict path,struct stat *restrict buf);

#打开文件夹

DIR *opendir(const char *name);

# 读取目录内容操作

int readdir_r(DIR *dirp, structdirent *entry, struct dirent **result);

# 关闭文件夹

int closedir(DIR *dirp);

# 获得当前的绝对路径

char *getcwd(char *buf, size_tsize);

# 改变文件权限

int chmod(const char *path, mode_tmode);

# 改变当前的工作目录

int chdir(const char *path);

 

1.2   典型场景

用户操作的电影场景如下:最常用的

fd = open(…)

lseek(fd…)

write(fd…)

# 或read(fd)

close(fd)

FILE = fopen(…)

fseek(FILE…)

fwrite(FILE…)

# 或fread(FILE)

fclose(FILE)

 

未完,待续

0 0
原创粉丝点击