背景知识
文件系统是操作系统中负责存取和管理信息的模块,它用统一的方式管理用户和系统信息的存储、检索、更新、共享和保护,并为用户提供一整套方便有效的文件使用和操作方法。文件这一术语不但反映了用户概念中的逻辑结构,而且和存放它的辅助存储器(也称文件存储器)的存储结构紧密相关。所以,同一个文件必须从逻辑文件和物理文件两个侧面来观察它。
对于用户来说,可按自己的愿望并遵循文件系统的规则来定义文件信息的逻辑结构,由文件系统提供“按名存取”来实现对用户文件信息的存储和检索。可见,使用者在处理他的信息时,只需关心所执行的文件操作及文件的逻辑结构,而不必涉及存储结构。但对文件系统本身来说,必须采用特定的数据结构和有效算法,实现文件的逻辑结构到存储结构的映射,实现对文件存储空间和用户信息的管理,提供多种存取方法。例如,用户希望与具体的存储硬件无关,使用路径名、文件名、文件内位移就可以进行数据(字节、字段或记录)的读、写、改、删操作;而作为实现这些功能的文件系统来说,它的工作与存储硬件紧密相关,是根据用户的文件操作请求,转化为对设备(磁盘)上的信息按照所在的位置(设备号、柱面号、磁道号和物理块号)进行寻址、读写和控制。所以,文件系统的功能就是要在逻辑文件与物理文件、逻辑地址与物理地址、逻辑结构与物理结构、逻辑操作与物理操作之间实现转换,保证存取速度快、存储空间利用率高、数据可共享、安全可靠性好。
文件系统的基本功能之一是负责文件目录的建立、维护和检索,要求编排的目录便于查找、防止冲突,目录的检索方便迅速。由于文件目录也需要永久保存,所以,把文件目录也组织成文件存放在磁盘上称目录文件。有了文件目录后,就可实现文件的“按名存取”。当用户要求存取某个文件时,系统查找文件目录并比较文件名就可找到所寻文件的文件控制块(文件目录项)。然后,再通过文件目录项指出文件的文件信息相对位置或文件信息首块物理位置等就能依次存取文件信息。
1、文件创建
任务描述:
- 输入要创建的文件名,输出是否创建成功信息
相关知识:
- FILE *fopen(const char *path, const char *mode):创建文件
fopen函数打开一个文件,文件名由函数参数path给出。参数mode指向一个字符串,字符串中包含着访问文件的方式,具有有:
“r”: 以只读方式打开文件,该文件必须存在。
“w”: 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
“r+”: 以可读写方式打开文件,该文件必须存在。
“w+”: 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
“a”: 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
“a+”: 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
如果打开文件成功,则fopen函数返回一个指向FILE结构体的指针,否则返回NULL,并把错误代码存在errno中。
FILE是个结构体,包含了管理文件流所需的各个信息,包括文件描述符,指向缓冲区的指针等。
使用w,w+,或a+,都可以创建一个文件。
- int fclose(FILE* stream):使用fclose函数来关闭fopen打开的文件流关闭一个流,可以把缓冲区内最后剩余的数据输出到磁盘文件中,并释放文件指针和有关的缓冲区。
main.c:
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp; if(argc!=2){ perror("argc error\n"); exit(1); } fp=fopen(argv[1],"w"); if(fp==NULL){ perror("fopen fail\n"); exit(1); } else printf("create success\n"); fclose(fp); return 0; }
2、文件写
任务描述:
- 输入文件名及要写入文件的字符串
- 每次需要在原有文件内容基础上追加写入
相关知识:
- size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *stream):向文件中写入数据
ptr:用于获取数据的地址(指针)
size:单个元素的大小,单位是字节
nmemb:元素个数
stream:提供数据的文件指针
函数返回写入文件的元素的个数
main.c:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) { FILE *fp; char str[20]={‘\0‘}; if(argc!=3){ perror("argc error\n"); exit(1); } fp=fopen(argv[1],"a+"); if(fp==NULL){ perror("fopen fail\n"); exit(1); } strcpy(str,argv[2]); fwrite(str,1,strlen(str),fp); fclose(fp); return 0; }
3、文件读
任务描述:
- 命令行中以文本文件名做输入参数,打印文件中内容
相关知识:
- size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream):从文件中读取数据
ptr:用于接收数据的地址(指针)
size:单个元素的大小,单位是字节
nmemb:元素个数
stream:提供数据的文件指针
返回值:读取的元素的个数
main.c:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main(int argc,char *argv[]) { FILE *fp; char str[20]={‘\0‘}; //memset(str,‘\0‘,20); if(argc!=2){ perror("argc error\n"); exit(1); } fp=fopen(argv[1],"r"); if(fp==NULL){ perror("fopen fail\n"); exit(1); } printf("The text in file is:"); fread(str,1,20,fp); printf("%s",str); fclose(fp); return 0; }
4、文件的重命名
任务描述:
- 输入文件名以及新文件名,输出是否成功命名文件
相关知识:
- int rename(const char *old_filename, const char *new_filename):对文件进行重命名
old_filename: 包含将要被重命名的文件的原始名称。
new_filename:新的文件名称。
main.c:
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) {int a; if(argc!=3){ perror("argc error\n"); exit(1); } a=rename(argv[1],argv[2]); if(a==-1){ perror("rename error\n"); exit(1); } else printf("rename success\n"); return 0; }
5、文件另存为
任务描述:
- 将已有文件另存为一个新的文件
- 综合文件的创建和读写操作
main.c:
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp1,*fp2; int n;char str[512]; if(argc!=3){ perror("argc error\n"); exit(1); } fp1=fopen(argv[1],"r"); if(fp1==NULL){ perror("fopen1 fail\n"); exit(1); } fp2=fopen(argv[2],"w"); if(fp2==NULL){ perror("fopen2 fail\n"); exit(1); } n=fread(str,1,20,fp1); if(n==-1){ perror("save fail\n"); exit(1); } else{ fwrite(str,1,n,fp2); printf("save success\n"); } fclose(fp1); fclose(fp2); return 0; }
6、文件的删除
任务描述:
- 输入要删除的文件名,输出是否删除成功的信息
相关知识:
- int remove(const char *filename):删除文件
main.c:
#include<stdio.h> #include<stdlib.h> int main(int argc,char *argv[]) { FILE *fp1;int n; if(argc!=2){ perror("argc error\n"); exit(1); } /* fp1=fopen(argv[1],"r"); if(fp1==NULL){ perror("fopen1 fail\n"); exit(1); } */ n=remove(argv[1]); if(n!=0){ perror("removr error\n"); exit(1); } else printf("remove success\n"); // fclose(fp1); return 0; }