以前做了个window移植到Linux中,涉及到了两种系统之间文件,线程,时间等内容的差异,今天就针对两种系统的文件操作进行总结;
文件操作是程序员最基本的需要掌握的知识,虽然知道一些,但是通过本编文章更深刻的进行掌握。
首先来看看Linux下的文件操作,都是可以通过man函数进行查看,今天把基本的操作列出来
1、我们都知道在Linux下,一切都是文件,文件操作进而可以分为两类:系统调用和库函数
在Linux下文件操作无非是open,close,read,write,lseek,通过这几个函数就可以实现对文件的读写等操作。
1.1 文件描述符
在进行文件操作的时候需要一个文件标识进行读写操作,这个标示就是文件描述符,也可以说是文件ID。一个文件ID在系统中唯一标识一个文件。
在系统开始启动的时候,就打开了三个文件描述符
0 ----标准输入
1 ----标准输出
2 ----标准错误
1.2 open函数
open顾名思义就是打开一个文件,并返回文件的描述符
在Linux下终端内,直接man open就可以找到open的规范描述,在描述中有两个介绍:
#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);
前面是open函数调用应该具有的头文件
参数说明:
path:准备打开的文件或设备名字;
flags:打开文件的访问模式;
访问模式可以是O_RDONLY 只读, O_WRONLY 只写, O_RDWR 可读可写;
还可以包括O_APPEDN 把写入的数据追加到文件末尾, O_CREAT但文件没有时,根据mode权限建立文件,这些模式可以通过位或进行组合;
mode:就是当使用 O_CREAT时,建立的文件所具有的权限;
S_IRUSR:读权限,文件所有者
S_IWUSER:写权限,文件所有者
。。。
为了方便,这些文件权限可以通过数字进行配置,和chmod赋予权限的类型相同。
open调用成功返回0,失败返回-1.
如:
open("my.file", O_RDWD|O_CREAT, 0666);
赋予文件my.file所有者,所有组,其他可读可写权限。
一个小例子:
进行编译,运行发现my.file的权限不对
这是什么原因呢?
以为系统有默认的权限,这是umask在搞怪。
当我们登录系统之后创建一个文件总是有一个默认权限的,那么这个权限是怎么来的呢?这就是umask干的事情。umask设置了用户创建文件的默认 权限,它与chmod的效果刚好相反,umask设置的是权限“补码”,而chmod设置的是文件权限码。
umask是一个函数,我们可以在代码中添加umask(0000),进行设置下,就可以了,我们试一下看看
加上了,果然没有问题了,你们也可以试试
1.3 close函数
这个函数很简单,先看看man close
#include <unistd.h>
int close(int fd);
close成功返回0, 失败返回-1
1.4 write函数
write将缓冲区中的数据写入文件,函数原型是:
ssize_t write(int fd, void *buf, size_t count);
参数说明:
fd:文件描述符;
buf:待写入的文件指针;
count:写入的字节数。
返回值:
返回成功写入的字符数,错误返回-1
1.5 read函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
参数和上面的write对应,这里就不写了。
返回值:返回成功读取的字符数。
小例子:
1.6 lseek函数
lseek针对文件的偏移。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
参数:
fd:文件描述符;
offset:针对文件的偏移,是根据whence的偏移,可正可负;
whence:文件便宜的开始位置;
SEEK_SET:文件开始位置
SEEK_CUR:文件当前位置
SEEK_END:文件结尾
返回:成功返回文件的偏移,失败返回-1.
我们直接可以采用lseek,获取文件的长度:
int file_len = lseek(fd, 0, SEEK_END);
2.window下的文件操作
简单介绍下window下的文件操作,这里面涉及内容很多
2.1 fopen函数
#include <stdio.h>
FILE * fopen(const char * path , const char * mode);
path:文件的路径;
mode:打开的流模式。
r:只读;
w:只写;
r+:更新方式读写打开;
w+:更新方式读写打开,并把文件长度截断为0;
a+:更新方式打开,并将内容追加在文件尾。
2.2 fwrite
size_t fwrite(const void *buf, size_t size, size_t count, FILE* stream);
buf:数据的指针;
size:写入的内容的单字节数;
count:写入字节数据项的个数;
stream:写入为文件流指针。
返回值:写入的数据项的个数
实际就是写入了count * size的大小内容
2.3 fread
size_t fread(const void *buf , size_t size, size_t count, FILE *stream);
这个和fwrite对应。
2.4 fclose
fclose(FILE *stream);
2.5 fseek
fseek是lseek系统调用对应的文件流函数。
int fseek(FILE *stream, long offset, int fromwhere);
这个和lseek相对应,就不详细说了。
例子就不弄了,关于这方面的内容很多,相信你们早已理解,这太简单了。