1. 文件编程概述(399.1)
- 内容超多:
- 文件系统原理及访问机制
- 文件在内核中的管理机制
- 什么是文件信息节点inode
- 文件的共享
- 文件权限,各种用户对其权限
- 。。。。。。
- 应用为王,如:
- 关心如何用代码操作文件,实现文件创建、打开、编辑等自动化执行
- Windows 如何手动修改文件,比如写一个 word 文档:
- 计算机如何帮助我们自动化完成以上操作?
- 操作系统提供了一系列的 API,如 Linux 系统:
- 打开 open
- 读写 write /read
- 光标定位 lseek
- 关闭 close
2. 文件打开及创建(400.2)
打开/创建文件
参数说明
- int 返回值:文件描述符,应为小的非负整数
- Pathname:要打开的文件名(含路径,缺省为当前路径)
- Flags:
- O_RDONLY 只读打开
- O_WRONLY 只写打开
- O_RDWR 可读可写打开
- 当我们附带了权限后,打开的文件就只能按照这种权限来操作。
- 以上这三个常数中应当指定一个。
- 下列常数是可选择的:
- O_CREAT:若文件不存在则创建它。使用此选项时,需要同时说明第三个参数 mode(0600),用其说明该新文件的存取许可权限
- O_EXCL:如果同时指定了O_CREAT,而文件已经存在,则出错
- O_APPEND:每次写时都加到文件的尾端
- O_TRUNC:属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为 0。
- Mode:一定是在 flags 中使用了 O_CREAT 标志,mode 记录待创建的文件的访问权限
- FILE/demo.c
#include
#include
#include
#include
int main(){
int fd;
fd = open("./file1",O_RDWR);
printf("fd = %d\n",fd);
return 0;
}
#include
#include
#include
#include
int main(){
int fd;
fd = open("./file1",O_RDWR);
printf("fd = %d\n",fd);
if(fd == -1){
printf("open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("fd = %d\n",fd);
printf("create file1 success!\n");
}
}
return 0;
}
- -rwx:
- -:普通文件
- r:可读
- w:可写
- x:可执行
3. 文件写入操作编程(401.3)
- 查看函数原型
写入文件
- write 返回的是写入的字节数
- FILE/demo3.c
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *buf = "Jessie is very kind.";
fd = open("./file1",O_RDWR);
printf("fd = %d\n",fd);
if(fd == -1){
printf("open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("fd = %d\n",fd);
printf("create file1 success!\n");
}
}
printf("open success : fd = %d\n",fd);
write(fd,buf,strlen(buf));
close(fd);
return 0;
}
4. 文件读取操作(402.4)
读取文件
- read 返回的是读取的字节数
- FILE/demo4.c
- FILE/demo5.c
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *buf = "Jessie is very kind.";
fd = open("./file1",O_RDWR);
printf("fd = %d\n",fd);
if(fd == -1){
printf("open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("fd = %d\n",fd);
printf("create file1 success!\n");
}
}
printf("open success : fd = %d\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to file1\n",n_write);
}
close(fd);
fd = open("./file1",O_RDWR);
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write + 1);
int n_read = read(fd,readBuf,n_write);
printf("read %d ,context:%s\n",n_read,readBuf);
close(fd);
return 0;
}
5. 文件光标移动操作(403.5)
将文件读写指针相对whence移动offset个字节
- FILE/demo6.c(打开、写入、定位光标、读取数据)
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *buf = "Jessie is very kind.";
fd = open("./file1",O_RDWR);
printf("fd = %d\n",fd);
if(fd == -1){
printf("open file1 failed\n");
fd = open("./file1",O_RDWR|O_CREAT,0600);
if(fd > 0){
printf("fd = %d\n",fd);
printf("create file1 success!\n");
}
}
printf("open success : fd = %d\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to file1\n",n_write);
}
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write + 1);
lseek(fd,-20,SEEK_CUR);
int n_read = read(fd,readBuf,n_write);
printf("read %d ,context:%s\n",n_read,readBuf);
close(fd);
return 0;
}
- FILE/demo7.c(lseek返回有多少个字节)
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *buf = "Jessie is very kind.";
fd = open("./file1",O_RDWR);
int filesize = lseek(fd,0,SEEK_END);
printf("file's size is :%d\n",filesize);
close(fd);
return 0;
}
关闭文件
6. 文件打开创建的补充(404.6)
O_EXCL:如果同时指定了 OCREAT,而文件已经存在,则出错(即返回-1)
#include
#include
#include
#include
int main(){
int fd;
fd = open("./file1",O_RDWR|O_CREAT|O_EXCL,0600);
if(fd == -1){
printf("File1 exists.\n");
}
return 0;
}
O_APPEND:每次写时都加到文件的尾端(另起一行)
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *buf = "Jessie is very kind.";
fd = open("./file1",O_RDWR|O_APPEND);
printf("open success : fd = %d\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to file1\n",n_write);
}
close(fd);
return 0;
}
- 有 O_APPEND 时:另起一行添加
- 无 O_APPEND 时:覆盖原先对应位置的字符,保留后边的字符
O_TRUNC:去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0(即删除原来的所有字符)
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char *buf = "Jessie.";
fd = open("./file1",O_RDWR|O_TRUNC);
printf("open success : fd = %d\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1){
printf("write %d byte to file1\n",n_write);
}
close(fd);
return 0;
}
创建文件creat函数
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
fd = creat("./file2",S_IRWXU);
return 0;
}
7. 文件操作原理简述(审核不过./7)
文件描述符
#include
#include
#include
#include
#include
#include
#include
int main(){
int fd;
char readBuf[128];
int n_read = read(0,readBuf,5);
int n_write = write(1,readBuf,strlen(readBuf));
printf("\ndone!\n");
return 0;
}
文件编程的一般步骤
- 打开/创建文件、读取文件/写入文件、关闭文件
Linux文件管理简述
8. 文件操作小应用之实现cp指令(405.8)
#include
int main(int argc, char **argv){
printf("totol params: %d\n",argc);
printf("No.1 params :%s\n",argv[0]);
printf("No.2 params :%s\n",argv[1]);
printf("No.3 params :%s\n",argv[2]);
return 0;
}
- FILE/demo13.c( 实现linux cp命令的代码)
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char **argv){
int fdSrc;
int fdDes;
char *readBuf=NULL;
if(argc != 3){
printf("pararm error\n");
exit(-1);
}
fdSrc = open(argv[1],O_RDWR);
int size = lseek(fdSrc,0,SEEK_END);
readBuf=(char *)malloc(sizeof(char)*size + 8);
lseek(fdSrc,0,SEEK_SET);
int n_read = read(fdSrc, readBuf, size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
int n_write = write(fdDes,readBuf,strlen(readBuf));
close(fdSrc);
close(fdDes);
return 0;
}
9. 解决上节课中的隐藏bug(406.9)
- FILE/demo13.c( 实现linux cp命令的代码)
int n_read = read(fdSrc, readBuf, size);
fdDes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);