内容超多
如
文件系统原理及访问机制
文件在内核中的管理机制
什么是文件信息节点inode
文件的共享
文件权限,各种用户对其权限
不建议太吃力
windows如何手动修改文档
**1.打开/创建文档
2.编辑文档
3.保存文档
4.关闭文档**
实现文件创建,打开,编辑等自动化执行
操作系统提供了一系列的API 如linux系统
打开 open
读写 write/read
光标定位 lseek
关闭 close
使用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);
int creat(const char* pathname, mode_t mode);
int open(const char* pathname, int flags);
第一个参数是指针, 指向文件的路径, 第二个参数是权限
open会返回一个文件操作符,一个小的非负整数
为了区分 read和write对文件的操作,通过文件描述符 ,其实是一个索引
每个进程打开一个文件的时候,它都会建立一个结构体来管理这些文件,文件描述符会指向这些结构体起到索引的作用
open的返回值很重要, 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若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错
O_APPEND 每次写时都加到文件的尾端
O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0
Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限
文件打开操作
open
int open(const char* pathname, int flags);
上面打开一个文件 ./file1 表示在当前路径打开file1 O_RDWR是可读可写权限
打开成功会返回一个3 也就是文件操作符,小的非负数
然后我们将file1删除之后,它就会返回一个负数
如果打开失败我们就创建它,用下面这个
int open(const char* pathname, int flags, mode_t mode);
open("./file1" , O_RDWR|O_CREAT, 0600);
open("./file1" , O_RDWR|O_CREAT, 0600);
这个代码的意思就是在当前路径下创建一个file1, 打开它的方式是可读可写
,如果没有就创建file1, 对file1的权限是可读可写
上面就没有这个file1文件,然后创建了file1的文件
文件操作权限
可读 r 4
可写 w 2
执行 x 1
0600 表示的是 2+4 =6 所以就是可写可读
文件写入操作
write
#include<unistd.h>
ssize_t write(int fd, const void *buf , size_t count);
fd文件操作符 第二个无类型指针 缓冲区, 第三个写入文件大小
将缓冲区buf指向内存中位置的数据 写count这么多的字节,写入打开的文件里面
使用write函数
将缓冲区buf中的数据wangyangjie 写入打开的文件中去
下面是将文件打开成功
file1里面的东西是 看来写入成功
文件读取操作
ssize_t read(int fd, void *buf, size_t count);
读文件操作所有过程
这里对fd指向的文件,读取n_write个,放到buf中去,因为n_write表示是写入多少个
因为readbuf是指针,所以要开辟空间,开辟的是读出多少个的空间也就是写入的
这里显然是读取失败了,因为光标问题
我们在写入数据的时候,光标定位在数据的最后,所以读取是从光标后面开始读取的所以我们有两种办法
第一种办法 是关闭文件重新打开
也就是在写入文件操作之后关闭文件重新打开
第二种办法是光标移动操作
光标移动操作
将文件读写指针相对whence移动offset个字节
off_t lseek(int fd, off_t offset, int whence);
SEEK_SET 指向文件头
The file offset is set to offset bytes.
文件偏移量设置为偏移字节
SEEK_CUR 指向当前光标位置
The file offset is set to its current location plus offse bytes.
文件偏移量设置为其当前位置加上偏移字节。
SEEK_END 指向文件尾巴
The file offset is set to the size of the file plus offset
bytes.
文件偏移量设置为文件大小加上偏移量字节。
通过上面lseek这个函数 将光标移动了回去
结果也顺利显示了出来
用这个也可以将光标定位
结果也是可以
如何计算文件大小 lseek
结果就是如下图所示
O_CREAT 若文件不存在则创建它,使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限
O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错
我们已经文件存在了,使用O_EXCL权限
文件会出错返回-1, 所以结果就是打开文件失败
O_APPEND 每次写时都加到文件的尾端 这又是什么意思呢
比如我们正常给文件写入东西的时候,我们原来文件如果是有东西的,那么我们就会把原来文件的东西给覆盖到,如果加上O_APPEND那么就会另起一行追加到后面去
我们首先看file1文件里面是12345678
然后对文件里面写入东西 wangyangjie12345678
我们会发现原来文件的内容被覆盖掉了
我们在打开的时候加上O_APPEND
我们可以看到原来的东西还在,它会自动在后面写入东西,而不会导致原来的东西被覆盖掉
O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0
我们先看原来文件中file1里面的内容是什么