实验四文件系统实验
文件管理系统实验报告

一、实验目的本次实验旨在通过设计和实现一个简单的文件管理系统,加深对文件管理原理的理解,掌握文件系统的基本操作,包括文件的创建、删除、修改、查询等,并了解文件系统的目录结构和管理机制。
二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C++4. 实验时间:2023年10月25日三、实验内容1. 文件系统的目录结构设计2. 文件的基本操作实现3. 文件系统的存储管理4. 文件系统的安全机制四、实验步骤1. 目录结构设计根据文件系统的需求,设计以下目录结构:```根目录│├── 文件夹A│ ├── 文件1.txt│ └── 文件2.txt│├── 文件夹B│ └── 文件3.txt│└── 文件夹C```2. 文件的基本操作实现(1)文件创建```cppvoid CreateFile(const std::string& filePath, const std::string& content) {// 检查文件是否存在if (CheckFileExist(filePath)) {std::cout << "文件已存在!" << std::endl;return;}// 创建文件std::ofstream file(filePath);if (file.is_open()) {file << content;file.close();std::cout << "文件创建成功!" << std::endl;} else {std::cout << "文件创建失败!" << std::endl;}}```(2)文件删除```cppvoid DeleteFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl;return;}// 删除文件if (remove(filePath) == 0) {std::cout << "文件删除成功!" << std::endl;} else {std::cout << "文件删除失败!" << std::endl;}}```(3)文件修改```cppvoid ModifyFile(const std::string& filePath, const std::string& newContent) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 修改文件内容std::ofstream file(filePath, std::ios::trunc); if (file.is_open()) {file << newContent;file.close();std::cout << "文件修改成功!" << std::endl; } else {std::cout << "文件修改失败!" << std::endl; }}```(4)文件查询```cppvoid QueryFile(const std::string& filePath) {// 检查文件是否存在if (!CheckFileExist(filePath)) {std::cout << "文件不存在!" << std::endl; return;}// 读取文件内容std::ifstream file(filePath);if (file.is_open()) {std::string content((std::istreambuf_iterator<char>(file)), std::istreambuf_iterator<char>());std::cout << "文件内容:" << content << std::endl;file.close();} else {std::cout << "文件读取失败!" << std::endl;}}```3. 文件系统的存储管理文件系统采用磁盘文件作为存储介质,通过文件操作实现对文件的读写。
操作系统-第四次实验报告-文件系统

全部代码可执行
实验介绍
本实验要求在假设的I/O 系统之上开发一个简单的文件系统, 这样做既能让实验者对文 件系统有整体了解,又避免了涉及过多细节。用户通过create, open, read 等命令与文件系统 交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0 至L-1。I/O 系统利 用内存中的数组模拟磁盘。 实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。I/O 系统的任务是隐藏磁 盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为 0 至L -1,其中L 表示磁盘的存储块总数。实验中,我们可以利用字符数组ldisk[L][B] 构 建磁盘模型,其中B 表示每个存储块的长度。I/O 系统从文件系统接收命令,根据命令指定 的逻辑块号把磁盘块的内容读入命令指定的内存区域, 或者把命令指定的内存区域内容写入 磁盘块。内存区域内容写入磁盘块。
整体组织
注:我定义的文件系统中,磁盘分为两大部分:数据区和保留区。其中保留区中又包含位图区和文件 描述符区,数据区的首部是文件的目录项,也就是说,文件的目录项在文件创建时会创建相应的目录 项在数据区的文件首部;而位图区用于表征数据的占用情况,例如数据区的第 N 块被分配了,那么位 图区中也要做相应的改变。
struct filesign { int file_length; int filesign_flag; int file_block;
int file_block_ary[FILE_BLOCK_LENGTH]; }; struct contents { char filename[FILE_NAME_LENGTH];
文件的读 int read(int,int,int)
实验四 文件管理

实验四文件管理班级:姓名:学号:【实验目的】通过调试并运行一个简单的文件系统来模拟文件操作命令的执行、模拟文件管理,使学生对主要文件操作命令的实质和执行过程有比较深入的了解,掌握它们的基本实施方法。
【实验要求】了解该系统的文件管理方案、数据结构、文件目录的建立与删除;理解系统在运行过程中显示的状态和有关参数变化情况的意义。
具体要求为:(1)了解一个支持n个用户的文件系统,每个用户可拥有多个文件。
(2)理解二级和多级文件目录管理。
(3)了解文件存取控制保护方式。
(4)了解常见的文件操作命令。
【实验环境】具备Windows或MS-DOS操作系统、带有Turbo Pascal集成环境的PC机。
【实验重点及难点】重点:理解文件管理的基本概念,文件管理中主要数据结构的设计和文件管理中文件、目录的建立和删除等算法的实现。
难点:实验程序的问题描述、实现算法、数据结构。
【实验内容】一.阅读实验程序文件管理模拟程序代码见【实验例程】。
二.编译实验例程用Turbo Pascal编译实验例程。
三.运行程序并对照实验源程序阅读理解实验中输入、输出的意义。
【实验例程】program filesystem;uses crt;const openf:integer=0;type str=string[6];linku=^datau;datau=recordfilename:str;pcode:integer;length:integer;addr:integer;next:linku;end;linkm=^datam;datam=recordusername:str;link:linku;end;linka=^dataa;dataa=recordfilename:str;pcode:integer;rpointer:integer;wpointer:integer;addr:integer;next:linka;end;varmfd:array[1..5]of linkm;p1,q1:linkm;p2,q2:linku;afd,p3,q3:linka;x,y1:str;i,y:integer;f:boolean;code:integer;procedure init;label a;beginclrscr;for i:=1to10do writeln;writeln('':25,'WELCOME TO OUR FILE SYSTEM!');writeln;writeln;writeln('':27,'Please press space bar!');repeat until readkey='';clrscr;a:write('User number?');readln(y1);val(y1,y,code);If code<>0then goto a;if y>5thenbeginwriteln('Users too many!(<=5)');goto a;end;writeln('Begin users login:');for i:=1to y dobeginwrite('User name',i,'?');readln(x);new(mfd[i]);mfd[i]^.username:=x;new(p2);p2^.next:=NIL;p2^.filename:='';mfd[i]^.link:=p2;end;if y<5thenfor i:=y+1to5domfd[i]:=NIL;new(afd);afd^.next:=NIL;afd^.filename:='';end;procedure pcreate;label a,b;beginwrite('User name?');readln(x);for i:=1to5doif x=mfd[i]^.username then goto b;writeln(x,'not been logined!');goto a;b:write('New file name?');readln(x);p2:=mfd[i]^.link;while p2^.next<>NIL do p2:=p2^.next;new(q2);q2^.next:=NIL;q2^.filename:='';p2^.next:=q2;p2^.filename:=x;repeat write('Protection code?');readln(y1);val(y1,y,code);until code=0;p2^.pcode:=y;p2^.length:=0;writeln('Create finished!');a:end;procedure popen;label a,b;beginwrite('Filename?');readln(x);for i:=1to5dobeginp2:=mfd[i]^.link;while(x<>p2^.filename)and(p2^.next<>NIL)do p2:=p2^.next;if x=p2^.filename then goto a;end;writeln('The file not been created!');goto b;a:if openf<5thenbeginopenf:=openf+1;q3:=afd;while q3^.next<>nil do q3:=q3^.next;new(p3);q3^.next:=nil;q3^.next:=p3;q3^.filename:=x;q3^.pcode:=p2^.pcode;q3^.rpointer:=0;q3^.wpointer:=0;writeln('Open finished!');endelse writeln('Open files too many!');b:end;procedure close1(t:integer);beginwrite('Filename?');readln(x);q3:=afd;i:=1;while(q3^.filename<>x)and(q3^.next<>nil)dobeginp3:=q3;q3:=q3^.next;end;i:=i+1;if q3^.filename=x thenbeginif q3=afd thenafd:=q3^.nextelsep3^.next:=q3^.next;openf:=openf-1;dispose(q3);if t=0then writeln('Close finished!');endelse if t=0thenwriteln('The file not been opened!');end;procedure pcolse;const t:integer=0;beginclose1(t);end;procedure pdelete;const t:integer=1;label a,b;beginclose1(t);for i:=1to5dobeginp2:=mfd[i]^.link;while(x<>p2^.filename)and(p2^.next<>nil)dobeginq2:=p2;p2:=p2^.next;end;if p2^.filename=x then goto a;end;writeln('The file not exist!1');goto a;a:if p2=mfd[i]^.link then mfd[i]^.link:=p2^.next else q2^.next:=p2^.next;dispose(p2);writeln('Delete finished!');b:end;procedure pread;beginwrite('The procedure has not exist!');end;procedure pwrite;beginwriteln('The procedure has not exist!');end;procedure pdirectory;label a,b;var c:char;j,n:integer;beginwrite('Main or user directory?(m/u)');readln(c);if c='m'thenbeginwriteln('Main File Directory');writeln('---------------------------------------');writeln('user_name file_number');j:=0;n:=0;for i:=1to5dobeginif mfd[i]=nil then goto b;write(mfd[i]^.username);p2:=mfd[i]^.link;while p2^.next<>nil dobeginj:=j+1;p2:=p2^.next;end;n:=n+j;writeln('':14,j);j:=0;end;b:writeln('total','':10,n)endelsebeginwrite('User name?');readln(x);for i:=1to5dobeginif mfd[i]^.username=x thenbeginwriteln('',x,'file directory');writeln('-------------------------------------------');writeln('Filename protection code length');p2:=mfd[i]^.link;while p2^.next<>nil dobeginwriteln('',p2^.filename,'':9,p2^.pcode,'':13,p2^.length);p2:=p2^.next;end;goto a;end;end;writeln('The directory not exist!');end;a:end;begininit;f:=true;while f dobeginrepeatwriteln;writeln;writeln('':27,'main menu');writeln('':15,'------------------------------------------------------------');writeln('':15,'||');writeln('':15,'| 1.create 2.open 3.close|');writeln('':15,'||');writeln('':15,'| 4.delete 5.read 6.write|');writeln('':15,'||');writeln('':15,'|7.driectory8.quit|');writeln('':15,'||');writeln('':15,'-----------------------------------------------------------') ;write('':17,'Which?');readln(y1);val(y1,y,code);until code=0;case y of1:pcreate;2:popen;3:pcolse;4:pdelete;5:pread;6:pwrite;7:pdirectory;8:halt;end;end;end.【问题与讨论】1、该文件模拟系统目录结构的特点?答:该文件采用文件系统的树形结构进行文件管理。
文件系统实验报告

文件系统实验报告文件系统实验报告篇一:内核,文件系统实验报告一嵌入式系统实验报告(一) 091180083刘浩通信工程一、实验目的了解嵌入式系统的开发环境,内核的下载和启动过程;了解Linux内核源代码的目录结构及相关内容;了解Linux内核各配置选项的内容和作用;掌握Linux内核的编译过程;理解嵌入式操作系统文件系统的类型和作用;了解jffs2文件系统的优点及其在嵌入式系统中的作用;掌握busybx软件制作嵌入式文件系统的方法;掌握Linux嵌入式文件系统的挂载过程。
二、嵌入式系统开发实验1、mini和tftp(1)串口通信的硬件基础:嵌入式系统一般通过异步串行接口(UART)进行初级引导。
本实验中用到的是RS-232C标准的接口。
(2)软件结构:mini 运行mini,Ctrl+A-进入mini的cnfiguratin界面。
对串行通信接口进行配置,如串行通信口的设置,波特率、数据位等串口参数的设置。
保存好设置后以后可以不用再设置。
(3)btlader引导:给开发板加电,任意按下一个键进入btlader界面。
可以通过命令行方式进行设置,按0进入命令行模式,出现 51bard,可以设置开发板和pc机的ip地址:set myipaddr 192.168.207.113(设置开发板的ip地址),set destipaddr 192.168.207.13(设置pc机的ip地址)。
注意ip地址的设置:使其处于同一网段,并且避免和其他系统的ip发生冲突。
(4)通过btlader的主菜单可以完成很多功能,3——下载内核,4——将内核烧进flash,5——下载文件系统,6——将文件系统烧进flash,7——启动嵌入式操作系统等。
由于btlader需要从服务器上下载内核和文件系统,一般采用tftp服务。
进入/etc/xinetd.d/tftp修改配置,注意一定要关闭防火墙,否则可能导致下载时出问题。
再设置完后要重新启动tftp服务。
文件系统 实验报告

文件系统实验报告引言文件系统是操作系统中的一部分,用于管理计算机中的文件和目录。
它提供了数据的存储、访问、组织和管理功能,是操作系统的基础之一。
本实验通过实现一个简单的文件系统来深入理解文件系统的原理和实现方式。
实验目的1. 了解文件系统的基本概念和原理;2. 学习文件系统的设计和实现方法;3. 掌握文件系统的基本操作。
实验环境本次实验使用的是Ubuntu 20.04操作系统。
实验步骤1. 文件系统的设计在开始实现文件系统之前,我们首先需要设计文件系统的结构和功能。
1.1 文件系统的结构文件系统通常由三个主要部分组成:文件控制块、目录和数据块。
文件控制块用于存储文件的属性和元数据,目录用于组织文件和子目录,数据块用于存储文件的实际内容。
1.2 文件系统的功能文件系统需要提供以下功能:- 文件的创建、读取、修改和删除;- 目录的创建、读取、修改和删除;- 文件和目录的查找;- 文件的权限管理。
2. 文件系统的实现2.1 文件系统的初始化在实现文件系统之前,我们首先需要初始化文件系统。
包括创建超级块、位图和根目录,并将它们写入磁盘。
2.2 文件和目录的操作在文件系统中,我们需要实现文件和目录的基本操作,包括创建文件、创建目录、读取文件内容、修改文件内容和删除文件。
2.3 文件系统的其他操作除了基本的文件和目录操作之外,文件系统还需要实现其他一些功能,如文件查找、权限管理等。
3. 文件系统的测试在完成文件系统的实现后,我们需要对其进行测试,以验证其功能是否正常。
3.1 创建文件和目录我们首先创建一些文件和目录,检查它们是否被正确地写入磁盘,并且能够被正确地读取。
3.2 读取和修改文件我们随机选择一些文件,读取它们的内容,并对其内容进行修改。
修改后,我们再次读取文件,确保修改成功。
3.3 删除文件和目录我们尝试删除一些文件和目录,并检查它们是否被成功地删除。
4. 结果与讨论经过测试,我们发现我们实现的文件系统功能正常,能够按照我们的预期进行文件和目录的创建、读取、修改和删除等操作。
(完整版)linux文件系统管理-权限管理实验4报告

实验报告课程Linux系统应用与开发教程实验名称linux文件系统管理-权限管理(高级设置)一、实验目的1、掌握Linux文件系统权限的设置2、掌握linux用户帐号与组管理3、掌握linux 文件共享的设置方法4、掌握linux 文件共享的权限设置方法二、实验内容1、使用root帐号通过系统提供的6个虚拟控制台登陆到linux,或在x-windows开启一个终端。
2、完成以下的实验内容(1)、假设你是系统管理员:现要在公司linux服务器系统中新增一些用户与一个用户组。
•使用groupadd account 添加一个名为account的组•使用useradd -G account acc-user1,(该命令将添加一个用户名为acc-user1的用户, 同时会建立一个与用户名同名的私有组(该私有组为用户的默认组,这个组中只有一个用户名),并把该用户将加入account的标准组,同时,按同样的方法建立acc-user2、acc-user3、acc-user4。
•建立用户后,请使用x-window中的用户与组管理工具查看用户与组建立情况,检查用户与组的归属情况。
(2)、开启多个控制台,分别使用acc-user1、acc-user2、acc-user3登陆系统(可以在控制台分别登陆,也可以在X-windows中多开几个终端程序,默认使用root登陆,然后使用su命令通过切换用户的方式登陆,其语法为“su - user-name”,提示可以在登陆成功后运行命令“id”查看当前登陆的用户属于哪些组,当前的默认组是什么?)(3)、为account组建立一个公共共享目录/home/account-share,满足以下的权限设定要求,以及设置何种的umask:•该目录的拥有者为acc-user1,所属组为account。
•在该目录下建立一个/home/account-share/full-share的子目录,修改该目录的权限,使得account组的成员均能在对该目录有完全控制权限,account组外的其他用户没有任何权限,即account组的成员都可以在该目录下建立文件,同时在该子目录full-share下建立的文件,只有文件建立者有权限删除,并且每个用户在该子目录full-share下建立的文件也能自动与该account组成员可读共享。
文件系统实验报告之欧阳引擎创编
试验四文件系统一、欧阳引擎(2021.01.01)二、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。
从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。
2、要求设计一个n个用户的文件系统,每次用户可以保存M个文件。
用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有create、delete、open、close、read、write等命令。
三、实验题目:采用二级目录结构实现磁盘文件操作。
要求:1.普通文件的目录项包括文件名,文件类型,文件长度,指向文件内容的指针内容。
2.目录文件的目录项包括目录名,指向下一级目录块的指针内容。
假定每个目录文件最多只能占用一个块;3.程序功能方面的要求:需要实现一个命令行操作界面,包含如下命令:4.程序实现方面的要求:(1)、对于重名(创建时),文件不存在(删除时),目录不存在(改变目录时)等错误操作情况,程序应该做出相应处理并给出错误信息,但是程序不得因此而退出。
(2)、界面友好,程序强壮。
(3)、设置界面的提示符,提示的命令以及调试的方法应和前面的要求一致。
不要自己设计命令或者附加不要求的功能。
三.实验源程序文件名: Filesystem_s.cpp执行文件名:Project1.exe四.实验分析1)总论:该系统是一个多用户、多任务的实时操作系统。
对用户和用户的文件数目并没有上限。
也就是说该系统允许任何用户申请空间,而且在其目录下的文件数目并不做任何的限制。
该系统的操作命令如下:①、bye-用户注销命令。
当使用该命令时,用户退出系统。
命令格式:run\bye↙系统注销该用户并回到登陆界面。
②、close-删除用户注册信息命令。
执行该命令后,用户在系统中的所有信息,包括该用户目录下的所有文件都被删除。
命令格式:run\close↙.完成后返回登陆界面。
③、create-在当前目录下创建一个文件,且该文件不能跟系统中的文件重名。
实验四 文件管理实验
实验四文件管理实验◆实验名称:文件管理实验◆仪器、设备:计算机◆参考资料:操作系统实验指导书◆实验目的:设计一个n个用户的文件系统,用户在一次运行中只能打开一个文件,有Create、delete、open、close、read、write等命令。
◆实验内容:为DOS系统设计一个简单的二级文件系统。
要求可以实现下列几条命令CREATE 创建文件DELETE 删除文件OPEN 打开文件CLOSE 关闭文件READ 读文件WRITE 写文件◆实验原理、数据(程序)记录:#define MAXNAME 25 /*the largest length of mfdname,ufdname,filename*/#define MAXCHILD 50 /*the largest child*/#define MAX (MAXCHILD*MAXCHILD) /*the size of fpaddrno*/void CreateF() /*Create File*/{int fpaddrno,flag=1,i;char fname[MAXNAME],str[50],str1[50],strtext[255],a[25];char fmode[25];int FindPANo(); /*find out physical address num*/int WriteF1(); /*write file*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You must create file in your own dir.\n");wgetchar=1;}else{ printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));if (ExistF(fname)>=0){printf("\nError. Name \'%s\' has already existed.\n",fname);wgetchar=1;} else{printf("Please input FileMode(0-Read Only, 1-Write Only, 2-Read and Write, 3-Protect):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)||(strcmp(fmode ,"3")==0)){fpaddrno=FindPANo();if (fpaddrno>=0){i=ExistD(username);strcpy(ufd[i]->ufdfile[fcount[i]].fname,fname);ufd[i]->ufdfile[fcount[i]].fpaddr=fpaddrno;ufd[i]->ufdfile[fcount[i]].fmode=atoi(fmode);ifopen[i][fcount[i]].ifopen=0;ifopen[i][fcount[i]].openmode=4;strcpy(str,"c:\\osfile\\file\\file");itoa(fpaddrno,str1,10);strcat(str,str1);fp_file=fopen(str,"wb");fclose(fp_file);fcount[i]++;while(flag){printf("Input text now(Y/N):");gets(a);ltrim(rtrim(a));ufd[i]->ufdfile[fcount[i]-1].flength=0;if(strcmp(strupr(a),"Y")==0){fp_file=fopen(str,"wb+");ufd[i]->ufdfile[fcount[i]-1].flength=WriteF1();flag=0;} else if(strcmp(strupr(a),"N")==0){flag=0;wgetchar=1;}} printf("\n\'%s\' has been created successfully!\n",fname);} else{printf("\nFail!No Disk Space. Please format your disk.\n");wgetchar=1;}} else {printf("\nError. FileMode\'s Range is 0-3\n");wgetchar=1;}}}}int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/{int i,j;int exist=0;int ExistD(char *dirname);j=ExistD(dirname);for(i=0;i<fcount[j];i++)if (strcmp(strupr(ufd[j]->ufdfile[i].fname),strupr(filename))==0){exist=1;break;}if (exist) return(i);else return(-1);}int FindPANo() /*find out physical address num*/{int i;for(i=0;i<MAX;i++)if (fpaddrno[i]==0) {fpaddrno[i]=1;break;}if (i<MAX) return(i);else return(-1);}int WriteF1() /*write file*/{int length=0;char c;printf("Please input text(\'#\' stands for end):\n");while((c=getchar())!='#'){fprintf(fp_file,"%c",c);if (c!='\n') length++;} fprintf(fp_file,"\n");fclose(fp_file);return(length);}******************************************************************************* void DeleteF() /*Delete File*/{char fname[MAXNAME];char str[50],str1[50];int i,j,k,flag=1;char a[25]; /*whether delete*/char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(dirname),strupr(username))!=0){printf("\nError. You can only delete file in your own dir.\n");wgetchar=1;}else{printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(username);if(ifopen[k][i].ifopen==1){printf("\nError. \'%s\' is in open status. Close it before delete.\n",fname);wgetchar=1;}else{while(flag){printf("\'%s\' will be deleted. Are you sure(Y/N):",fname);gets(a);ltrim(rtrim(a));if(strcmp(strupr(a),"Y")==0){fpaddrno[ufd[k]->ufdfile[i].fpaddr]=0;itoa(ufd[k]->ufdfile[i].fpaddr,str,10);for(j=i;j<fcount[k]-1;j++){strcpy(ufd[k]->ufdfile[j].fname,ufd[k]->ufdfile[j+1].fname);ufd[k]->ufdfile[j].fpaddr=ufd[k]->ufdfile[j+1].fpaddr;ufd[k]->ufdfile[j].flength=ufd[k]->ufdfile[j+1].flength;ufd[k]->ufdfile[j].fmode=ufd[k]->ufdfile[j+1].fmode;ifopen[k][j]=ifopen[k][j+1];}fcount[k]--;strcpy(str1,"c:\\osfile\\file\\file");strcat(str1,str);remove(str1);flag=0;printf("\n\'%s\' has been deleted successfully.\n",fname);wgetchar=1;}else if(strcmp(strupr(a),"N")==0){printf("\nError. \'%s\' hasn\'t been deleted.\n",fname);wgetchar=1;flag=0;}}}}else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void OpenF() /*Open File*/{char fname[MAXNAME];char str[25],str1[25],fmode[25];int i,k;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please change to ufd dir before open.\n");wgetchar=1;return;}printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if (i>=0){k=ExistD(dirname);if(!ifopen[k][i].ifopen){if (ufd[k]->ufdfile[i].fmode==3){printf("\nError. The file\'s mode is FORBID. Can not open.\n");wgetchar=1;}else{printf("Please input FileOpenMode(0-Read Only,1-Write Only,2-Read and Write):");gets(fmode);ltrim(rtrim(fmode));if((strcmp(fmode,"0")==0)||(strcmp(fmode,"1")==0)||(strcmp(fmode,"2")==0)){if(fmode[0]=='0') /*open file with read only mode*/{strcpy(str,"read only");if((ufd[k]->ufdfile[i].fmode==0)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='1') /*open file with write only mode*/{strcpy(str,"write only");if((ufd[k]->ufdfile[i].fmode==1)||(ufd[k]->ufdfile[i].fmode==2)) ifopen[k][i].ifopen=1;}else if(fmode[0]=='2') /*open file with read and write mode*/{strcpy(str,"read and write");if(ufd[k]->ufdfile[i].fmode==2) ifopen[k][i].ifopen=1;}if(ufd[k]->ufdfile[i].fmode==0) strcpy(str1,"read only"); /*FileMode*/else if(ufd[k]->ufdfile[i].fmode==1) strcpy(str1,"write only");else if(ufd[k]->ufdfile[i].fmode==2) strcpy(str1,"read and write");if(ifopen[k][i].ifopen==1){ifopen[k][i].openmode=atoi(fmode);if (ifopen[k][i].openmode==0) strcpy(str,"read only");else if(ifopen[k][i].openmode==1) strcpy(str,"write only");else if(ifopen[k][i].openmode==2) strcpy(str,"read and write");printf("\n\'%s\' has been opened. OpenMode is %s,FileModeis %s\n",fname,strupr(str),strupr(str1));wgetchar=1;} else{printf("\nError. \'%s\' hasn\'t been opened. OpenMode Error. OpenMode is %s,but FileMode is %s\n",fname,strupr(str),strupr(str1));wgetchar=1;}} else {printf("\nError. FileOpenMode\'s Range is 0-2\n");wgetchar=1;}}} else {printf("\nError. \'%s\' is in open status.\n",fname);wgetchar=1;}} else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}******************************************************************************* void CloseF() /*Close File*/{int i,k,n=0;char fname[MAXNAME];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0){printf("\nError. Please convert to ufd dir before close.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) In This Ufd:\n"); /*display openned file*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1) {printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");} printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){ifopen[k][i].ifopen=0;ifopen[k][i].openmode=4;printf("\n\'%s\' has been closed successfully.\n",fname);wgetchar=1;} else {printf("\nError.\'%s\' is in closing status.\n",fname);wgetchar=1;}} else {printf("\nError. \'%s\' is not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void ReadF() /*Read File*/{int i,k,n=0;char fname[MAXNAME];char str[255],str1[255],c;char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError.Please convert to ufd dir before read.\n");wgetchar=1;return;}printf("\nCaution:Open file first\n");printf("Opened File(s) List:\n");k=ExistD(dirname);for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files openned.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==0) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);fp_file=fopen(str,"rb");fseek(fp_file,0,0);printf("\nThe text is:\n\n");printf(" ");while(fscanf(fp_file,"%c",&c)!=EOF)if (c=='\n') printf("\n ");else printf("%c",c);printf("\n\n%d Length.\n",ufd[k]->ufdfile[i].flength);fclose(fp_file);wgetchar=1;}else{printf("\nError.\'%s\' has been opened with WRITE ONLY mode. It isn\'tread.\n",fname);wgetchar=1;}}else {printf("\nError.\'%s\' is in closing status. Please open it beforeread\n",fname);wgetchar=1;}}else {printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}******************************************************************************* void WriteF() /*Write File*/{int i,k,n=0;char fname[MAXNAME];char str[50],str1[50],a[50];char *rtrim(char *str); /*remove the trailing blanks.*/char *ltrim(char *str); /*remove the heading blanks.*/int ExistF(char *filename); /*Whether FileName Exist,Exist-i,Not Exist-0*/int ExistD(char *dirname);int WriteF1(); /*write file*/if (strcmp(strupr(ltrim(rtrim(dirname))),"")==0) {printf("\nError. Please convert to ufd dir before write.\n");wgetchar=1;return;}k=ExistD(dirname);printf("\nOpen File(s) with write only mode or read and write mode:\n");/*display openned files with writable mode*/for(i=0;i<fcount[k];i++){if (ifopen[k][i].ifopen==1)if ((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){printf("%15s",ufd[k]->ufdfile[i].fname);n++;}if((n%4==0)&&(n!=0)) printf("\n");}printf("\n%d files open.\n",n);if (n==0) wgetchar=1;if(n!=0){printf("\nPlease input FileName:");gets(fname);ltrim(rtrim(fname));i=ExistF(fname);if(i>=0){if(ifopen[k][i].ifopen==1){if((ifopen[k][i].openmode==1) ||(ifopen[k][i].openmode==2)){itoa(ufd[k]->ufdfile[i].fpaddr,str,10);strcpy(str1,"file");strcat(str1,str);strcpy(str,"c:\\osfile\\file\\");strcat(str,str1);if (ufd[k]->ufdfile[i].flength!=0){printf("\n\'%s\' has text. Overwrite or Append(O-overwrite,A-Append,else-not write):",fname);gets(a);ltrim(rtrim(a));if (fp_file!=NULL) fclose(fp_file);if (strcmp(strupr(a),"O")==0){printf("\nOverwrite\n");fp_file=fopen(str,"wb");ufd[k]->ufdfile[i].flength=0;ufd[k]->ufdfile[i].flength=WriteF1();}else if(strcmp(strupr(a),"A")==0){printf("\nAppend\n");fp_file=fopen(str,"ab");ufd[k]->ufdfile[i].flength=ufd[k]->ufdfile[i].flength+WriteF1();}else{printf("\nError.\'%s\' has not been written.\n",fname);fclose(fp_file);wgetchar=1;} }else{fp_file=fopen(str,"wb");ufd[k]->ufdfile[i].flength=WriteF1();}}else{printf("\nError. \'%s\' has been opened with read only mode.It isn\'twrited.\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' is in closing status. Please open it beforewrite\n",fname);wgetchar=1;}}else{printf("\nError. \'%s\' does not exist.\n",fname);wgetchar=1;}}}◆实验结果及分析通过实验实现了有Create、delete、open、close、read、write等命令的简单的文件系统。
第4章文件系统实验
1.用于接收数据的地址(指针)(buffer)
2.单个元素的大小(size):单位是字节而不是位,例如读取一个int型数据就是4个字节
3.元素个数(count)
4.提供数据的文件指针(stream)
返回值:读取的元素的个数
(3)
通过strstr()函数将找出cpu MHz在buffer出现的位置,为之后的提取值做准备
1.切换用户
2.建立文件,并查看文件
3.创建软连接ຫໍສະໝຸດ 4.查看创建结果5.查看结果
6.修改test
7.查看结果
分析结果
(1)创建链接后,读取test1的时候,由于链接的原因,实际上读取到的是test的内容,所以读取test.txt和test01时显示的内容是一样的。修改test之后,test01也会跟着改变,显示了同步性。
format格式控制字符串
argument选择性设定字符串
sscanf会从buffer里读进数据,依照argument的设定将数据写回。
三、实现文件的拷贝,即把一个文件内容复制到另一个文件
1.创建文件
2.编译代码
3.运行
4.创建t1,t2
5.运行copy代码
6.查看结果
7.删除t1
8.查看t2
结果分析:
strstr()
包含文件:string.h
函数原型:extern char *strstr(char *str1, char *str2);
功能:找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符)。
返回值:返回该位置的指针,如找不到,返回空指针。
(4)
通过sscanf语句提取cpu的时钟频率
操作系统课程实验报告
实验四 NTFS文件系统应用
用002 账户登录计算机,将加密的文件夹Test2设置为压缩文件夹。
问:①一个文件夹能否同时设置加密和压缩属性?
②压缩后的文件在访问时是否需要先解压缩?
③压缩的文件夹能否设置为共享文件夹?
4、NTFS磁盘配额管理
用001 账户登录计算机,在一个驱动器上启用磁盘配额。
练习1:查看该驱动器上各用户的磁盘使用情况。
练习2:把002 账户的配额设置为:磁盘空间限制为5MB,警告等级为4MB。
切换到002 账户,在该驱动器上创建一个文件夹,向其中复制一些文件,当复制到一定程度时会出现什么问题?
四、练习题
计算机中有一个账户名为zhang 的用户,该用户是一个只能通过网络访问此计算机的用户。
Administrator 想要在计算机中指派一个专用的文件夹供该用户通过网络访问,有如下要求:
1、用户zhang可通过此文件夹上传、下载文件,也可以删除、重命名文件;(对一个文件夹的权限的设置)
2、用户zhang最多可使用50MB 的磁盘空间。
请按上面的要求进行配置。
五、结束实验:
1、取消磁盘配额限制;
2、删除所有自建的文件夹;
3、删除001 账户、002 账户;
六、实验调查:
对本实验的建议和意见:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验四文件系统实验1)掌握文件系统的工作机理。
2)理解文件系统的主要数据结构。
3)学习较为复杂的LINU某下的编程实验内容设计并实现一个一级(单用户)文件系统程序a.提供以下操作:文件创建/删除接口命令create/delete目录创建/删除接口命令mkdir/rmdir显示目录内容命令lb.创建的文件不要求格式和内容2)设计并实现一个二级文件系统程序a.提供用户登录;b.文件、目录要有权限实验结果及其解释说明基本上实现了简单文件系统的实现。
创建并读写文件如下图所示:打开文件、关闭文件、创建并显示子目录、删除子目录如下图所示:实验中的问题及解决首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都应以文件的形式存放于磁盘,这样便于查找和修改。
由于对文件系统理解不够深刻,导致程序在一些原理上的迷糊不清,而时间较短,因此采取了简化的方法。
在写程序的开始也没有做详细的规划,因此在程序的结构上有些混乱。
在后期做了一些调整,但是整体还是有缺陷的。
另外程序只是很简单的实现了文件管理系统,只有一些非常简单的功能,而且功能考虑的也不尽全面、严谨,难免会出现一些Bug。
必须对写好的程序进行反复的调试和优化。
实验体会程序清单#include#include#include#defineDIR_LENGTH1024/某路径最长可达100字节某/#defineMA某_WRITE1024某128/某写入文字可达128k字节某/#defineMEM_D_SIZE1024某1024/某1M磁盘空间某/#defineDISKSIZE1024/某磁盘快的大小1K某/#defineMSD5/某最大子目录数5(类似五叉树)某/#defineDISK_NUMMEM_D_SIZE/DISKSIZE/某磁盘快数目1024=1M/1K某/#defineFATSIZEDISK_NUM某izeof(tructfatitem)/某FAT表大小8K=8192B(理想应该是1.5K)某/#defineMOFN5/某最大文件打开数5(即除根以外最大深度为5)某/#defineROOT_DISK_NOFATSIZE/DISKSIZE+1/某根目录起始盘快号9某/#defineROOT_DISK_SIZEizeof(tructdirect)/某根目录大小196某/ /某---------------FAT表项结构-----------------------某/tructfatitem/某ize8某/{intitem;/某存放文件下一个磁盘的指针某/charem_dik;/某磁盘块是否空闲标志位0空闲某/};/某-------------------目录项结构------------------------某/tructdirect/某ize196某/{/某-----文件控制快信息-----某/tructFCB{charname[9];/某文件/目录名8位某/charproperty;/某属性1位目录0位普通文件某/intize;/某文件/目录字节数(原注释位盘块数)某/intfirtdik;/某文件/目录起始盘块号某/intne某t;/某子目录起始盘块号某/intign;/某1是根目录0不是根目录某/}directitem[MSD+2];};/某------------------文件打开表项结构--------------------------某/tructopentable/某ize104某/{tructopenttableitem/某ize20某/{charname[9];/某文件名某/intfirtdik;/某起始盘块号某/intize;/某文件的大小某/}openitem[MOFN];intcur_ize;/某当前打文件的数目某/};/某-------------------------------------------------------------------某/tructfatitem某fat;/某FAT表某/tructdirect某root;/某根目录某/tructdirect某cur_dir;/某当前目录某/tructopentableu_opentable;/某文件打开表某/intfd=-1;/某文件打开表的序号某/char某bufferdir;/某记录当前路径的名称某/char某fdik;/某虚拟磁盘起始地址某/voidinitfile();voidformat();voidenter();voidhalt();intcreate(char某name);intopen(char某name);intcloe(char某name);intwrite(intfd,char某buf,intlen);intread(intfd,char某buf);intdel(char某name);intmkdir(char某name);intrmdir(char某name);voiddir();intcd(char某name);voidprint();voidhow();/某----------------------------------------------------------------------------------------------某//某------------------------------------------初始化文件系统--------------------------------------某/voidinitfile(){ fdik=(char某)malloc(MEM_D_SIZE某izeof(char));/某申请1M空间某/format();free(fdik);}/某----------------------------------------------------------------------------------------------某//某------------------------------------------格式化----------------------------------------------某/voidformat(){inti;FILE某fp;fat=(tructfatitem某)(fdik+DISKSIZE);/某计算FAT表地址(为什么向后偏移1k)某//某-----初始化FAT表------------某/fat[0].item=-1;/某引导块某/fat[0].em_dik='1';for(i=1;ifat[i].item=i+1;fat[i].em_dik='1';}fat[ROOT_DISK_NO-1].item=-1;fat[ROOT_DISK_NO-1].em_dik='1';fat[ROOT_DISK_NO].item=-1;/某存放根目录的磁盘块号某/fat[ROOT_DISK_NO].em_dik='1';for(i=ROOT_DISK_NO+1;ifat[i].item=-1;fat[i].em_dik='0';}/某-----------------------------------------------某/root=(tructdirect某)(fdik+DISKSIZE+FATSIZE);/某根目录的地址某//某初始化目录某//某---------指向当前目录的目录项---------某/root->directitem[0].ign=1;root->directitem[0].firtdik=ROOT_DISK_NO;trcpy(root->directitem[0].name,\root->directitem[0].ne某t=root->directitem[0].firtdik;root->directitem[0].property='1';root->directitem[0].ize=ROOT_DISK_SIZE;/某-------指向上一级目录的目录项---------某/root->directitem[1].ign=1;root->directitem[1].firtdik=ROOT_DISK_NO;trcpy(root->directitem[1].name,\root->directitem[1].ne某t=root->directitem[0].firtdik;root->directitem[1].property='1';root->directitem[1].ize=ROOT_DISK_SIZE;for(i=2;iroot->directitem[i].ign=0;root->directitem[i].firtdik=-1;trcpy(root->directitem[i].name,\root->directitem[i].ne某t=-1;root->directitem[i].property='0';root->directitem[i].ize=0;} if((fp=fopen(\{printf(\return;}if(fwrite(fdik,MEM_D_SIZE,1,fp)!=1)/某把虚拟磁盘空间保存到磁盘文件中某/{printf(\}fcloe(fp);}/某----------------------------------------------------------------------------------------------某//某--------------------------------进入文件系统--------------------------------------------------某/voidenter(){FILE某fp;inti;fdik=(char某)malloc(MEM_D_SIZE某izeof(char));/某申请1M空间某/if((fp=fopen(\{printf(\return;}if(!fread(fdik,MEM_D_SIZE,1,fp))/某把磁盘文件dik.dat读入虚拟磁盘空间(内存)某/{printf(\e某it(0);}fat=(tructfatitem某)(fdik+DISKSIZE);/某找到FAT表地址某/root=(tructdirect某)(fdik+DISKSIZE+FATSIZE);/某找到根目录地址某/fcloe(fp);/某--------------初始化用户打开表------------------某/for(i=0;itrcpy(u_opentable.openitem[i].name,\u_opentable.openitem[i]. firtdik=-1;u_opentable.openitem[i].ize=0;}u_opentable.cur_ize=0;cur_dir=root;/某当前目录为根目录某/bufferdir=(char某)malloc(DIR_LENGTH某izeof(char));trcpy(bufferdir,\显示根目录为E:某/}-------------------------------------某//某------------------------------------退出文件系统----------------------------------------------某/voidhalt(){FILE某fp;inti;if((fp=fopen(\{printf(\return;}if(!fwrite(fdik,MEM_D_SIZE,1,fp))/某把虚拟磁盘空间(内存)内容读入磁盘文件dik.dat某/{printf(\}fcloe(fp);free(fdik);free(bufferdir);for(i=0;itrcpy(u_opentable.openitem[i].name,\u_opentable.openitem[i]. firtdik=0;u_opentable.openitem[i].ize=0;}u_opentable.cur_ize=0;/某用户打开文件数清零某/return;}-------------------------------------某//某----------------------------------------创建文件----------------------------------------------某/intcreate(char某name){inti,j;if(trlen(name)>8)/某文件名大于8位某/return(-1);for(i=2;iif(cur_dir->directitem[i].firtdik==-1)break;}for(j=2;j{if(!trcmp(cur_dir->directitem[j].name,name))break;}if(i>=MSD+2)/某无空目录项某/return(-2);if(u_opentable.cur_ize>=MOFN)/某打开文件太多(第五层)某/return(-3);if(jfor(j=ROOT_DISK_NO+1;jif(fat[j].em_dik=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_dik='1';/某将空闲块置为已经分配某//某-----------填写目录项-----------------某/trcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firtdik=j;cur_dir->directitem[i].ize=0;cur_dir->directitem[i].ne某t=j;cur_dir->directitem[i].property='0';/某cur_dir->directitem[i].ign丢失某//某---------------------------------某/fd=open(name);/某打开所创建的文件某/return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------打开文件----------------------------------------------某/intopen(char某name){inti,j;for(i=2;iif(!trcmp(cur_dir->directitem[i].name,name))break;}if(i>=MSD+2)/某文件不存在某/return(-1);/某--------是文件还是目录-----------------------某/if(cur_dir->directitem[i].property=='1')/某是目录,不可打开读写某/return(-4);/某--------文件是否打开-----------------------某/for(j=0;j if(!trcmp(u_opentable.openitem[j].name,name))break;}if(jif(u_opentable.cur_ize>=MOFN)/某文件打开太多某/return(-3);/某--------查找一个空闲用户打开表项-----------------------某/for(j=0;jif(u_opentable.openitem[j].firtdik==-1)break;}/某--------------填写表项的相关信息------------------------某/u_opentable.openitem[j].firtdik=cur_dir->directitem[i].firtdik;trcpy(u_opentable.openitem[j].name,name);u_opentable.openitem[j].ize=cur_dir->directitem[i].ize;u_opentable.cur_ize++;/某----------返回用户打开表表项的序号--------------------------某/return(j);}/某----------------------------------------------------------------------------------------------某//某----------------------------------------关闭文件----------------------------------------------某/intcloe(char某name){inti;for(i=0;i{if(!trcmp(u_opentable.openitem[i].name,name))break;}if(i>=MOFN)/某--文件没有打开-某/return(-1);/某-----------清空该文件的用户打开表项的内容---------------------某/trcpy(u_opentable.openitem[i].name,\u_opentable.openitem[i].fir tdik=-1;u_opentable.openitem[i].ize=0;u_opentable.cur_ize--;fd=-1;/某文件打开表的序号为-1某/return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------写文件------------------------------------------------某/intwrite(intfd,char某buf,intlen){char某firt;intitem,i,j,k;intilen1,ilen2,modlen,temp;/某----------用$字符作为空格#字符作为换行符-----------------------某/charSpace=32;/某SPACE的ASCII码值某/charEndter='\\n';for(i=0;iif(buf[i]=='$')/某用$字符作为空格某/buf[i]=Space;eleif(buf[i]=='#')buf[i]=Endter;}/某----------读取用户打开表对应表项第一个盘块号-----------------------某/item=u_opentable.openitem[fd].firtdik;/某-------------找到当前目录所对应表项的序号-------------------------某/for(i=2;iif(cur_dir->directitem[i].firtdik==item)break;}temp=i;/某-存放当前目录项的下标-某//某------找到的item是该文件的最后一块磁盘块-------------------某/while(fat[item].item!=-1){item=fat[item].item;/某-查找该文件的下一盘块--某/}/某-----计算除该文件的最末地址-------某/firt=fdik+item某DISKSIZE+u_opentable.openitem[fd].ize%DISKSIZE;/某-----如果最后磁盘块剩余的大小大于要写入的文件的大小-------某/if(DISKSIZE-u_opentable.openitem[fd].ize%DISKSIZE>len){ trcpy(firt,buf);u_opentable.openitem[fd].ize=u_opentable.openitem[fd].ize+le n;cur_dir->directitem[temp].ize=cur_dir->directitem[temp].ize+len;}ele{for(i=0;i/某-----计算分配完最后一块磁盘的剩余空间(字节)还剩下多少字节未存储-------某/ilen1=len-(DISKSIZE-u_opentable.openitem[fd].ize%DISKSIZE);ilen2=ilen1/DISKSIZE;modl en=ilen1%DISKSIZE;if(modlen>0)ilen2=ilen2+1;/某--还需要多少块磁盘块-某//某调试时特别注意某/for(j=0;jfor(i=ROOT_DISK_NO+1;iif(fat[i].em_dik=='0')break;}if(i>=DISK_NUM)/某--如果磁盘块已经分配完了-某/return(-1);firt=fdik+i某DISKSIZE;/某--找到的那块空闲磁盘块的起始地址-某/if(j==ilen2-1)/某--如果是最后要分配的一块-某/{for(k=0;kele/某-如果不是要最后分配的一块--某/{for(k=0;kfat[item].item=i;/某--找到一块后将它的序号存放在上一块的指针中-某/fat[i].em_dik='1';/某--置找到的磁盘快的空闲标志位为已分配-某/fat[i].item=-1;/某--它的指针为-1(即没有下一块)-某/} /某--修改文件打开表用户的长度-某/u_opentable.openitem[fd].ize=u_opentable.openitem[fd].ize+le n;/某--修改目录项的文件长度-某/cur_dir->directitem[temp].ize=cur_dir->directitem[temp].ize+len;}return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------读文件------------------------------------------------某/intread(intfd,char某buf){intlen=u_opentable.openitem[fd].ize;char某firt;inti,j,item;intilen1,modlen;item=u_opentable.openitem[fd].firtdik;if(len>u_opentable.openitem[fd].ize)/某--欲读出的文件长度比实际文件长度长-某/return(-1);ilen1=len/DISKSIZE;modlen=len%DISKSIZE;if(modlen!=0)ilen1=ilen1+1;/某--计算文件所占磁盘的块数-某/firt=fdik+item某DISKSIZE;/某--计算文件的起始位置-某/for(i=0;i{if(i==ilen1-1)/某--如果在最后一个磁盘块-某/{for(j=0;jele/某--不在最后一块磁盘块-某/{for(j=0;jitem=fat[item].item;/某-查找下一盘块-某/firt=fdik+item某DISKSIZE;}}return0;}/某----------------------------------------------------------------------------------------------某//某----------------------------------------删除文件----------------------------------------------某/intdel(char某name){inti,cur_item,item,temp;for(i=2;iif(!trcmp(cur_dir->directitem[i].name,name))break;}cur_item=i;/某--用来保存目录项的序号,供释放目录中-某/if(i>=MSD+2)/某--如果不在当前目录中-某/return(-1);if(cur_dir->directitem[cur_item].property!='0')/某--如果删除的(不)是目录-某/return(-3);for(i=0;iif(!trcmp(u_opentable.openitem[i].name,name))return(-2);}item=cur_dir->directitem[cur_item].firtdik;/某--该文件的起始盘块号-某/while(item!=-1)/某--释放空间,将FAT表对应项进行修改-某/{temp=fat[item].item;fat[item].item=-1;fat[item].em_dik='0';item=temp;}/某-----------------释放目录项-----------------------某/cur_dir->directitem[cur_item].ign=0;cur_dir->directitem[cur_item].firtdik=-1;trcpy(u_opentable.openitem[cur_item].name,\cur_dir->directitem[cur_item].ne某t=-1;cur_dir->directitem[cur_item].property='0';cur_dir->directitem[cur_item].ize=0;return0;}/某----------------------------------------------------------------------------------------------某//某---------------------------------------创建子目录---------------------------------------------某/intmkdir(char某name){inti,j;tructdirect某cur_mkdir;if(trchr(name,'\\\\'))/某如果目录名中有'\\'字符某/return(-4);if(!trcmp(name,\return(-6);if(!trcmp(name,\return(-6);if(trlen(name)>8)/某-如果目录名长度大于8位-某/return(-1);for(i=2;iif(cur_dir->directitem[i].firtdik==-1)break;}if(i>=MSD+2)/某-目录/文件已满-某/return(-2);for(j=2;jif(!trcmp(cur_dir->directitem[j].name,name))break;}if(jfor(j=ROOT_DISK_NO+1;jif(fat[j].em_dik=='0')break;}if(j>=DISK_NUM)return(-5);fat[j].em_dik='1';/某-将该空闲块设置为已分配-某//某-------------填写目录项----------某/trcpy(cur_dir->directitem[i].name,name);cur_dir->directitem[i].firtdik=j;cur_dir->directitem[i].ize=ROOT_DISK_SIZE;cur_dir->directitem[i].ne某t=j;/某-指向子目录(其实就是其本身)的起始盘块号-某/cur_dir->directitem[i].property='1';/某-ign=1为根标志,这里可以省略-某//某-所创目录在虚拟磁盘上的地址(内存物理地址)-某/cur_mkdir=(tructdirect某)(fdik+cur_dir->directitem[i].firtdik某DISKSIZE);/某-初始化目录-某//某-指向当前目录的目录项-某/cur_mkdir->directitem[0].ign=0;cur_mkdir->directitem[0].firtdik=cur_dir->directitem[i].firtdik;trcpy(cur_mkdir->directitem[0].name,\ cur_mkdir->directitem[0].ne某t=cur_mkdir->directitem[0].firtdik;cur_mkdir->directitem[0].property='1';cur_mkdir->directitem[0].ize=ROOT_DISK_SIZE;/某-指向上一级目录的目录项-某/cur_mkdir->directitem[1].ign=cur_dir->directitem[0].ign;/某-指向上一级目录的目录项-某/cur_mkdir->directitem[1].firtdik=cur_dir->directitem[0].firtdik;trcpy(cur_mkdir->directitem[1].name,\ cur_mkdir->directitem[1].ne某t=cur_mkdir->directitem[1].firtdik;cur_mkdir->directitem[1].property='1';cur_mkdir->directitem[1].ize=ROOT_DISK_SIZE;for(i=2;icur_mkdir->directitem[i].ign=0;cur_mkdir->directitem[i].firtdik=-1;trcpy(cur_mkdir->directitem[i].name,\cur_mkdir->directitem[i].ne某t=-1;cur_mkdir->directitem[i].property='0';cur_mkdir->directitem[i].ize=0;} return0;}/某----------------------------------------------------------------------------------------------某//某---------------------------------------删除子目录---------------------------------------------某/intrmdir(char某name){inti,j,item;tructdirect某temp_dir;/某-检查当前目录项中有无该目录-某/for(i=2;iif(!trcmp(cur_dir->directitem[i].name,name))break;}if(cur_dir->directitem[i].property!='1')/某-删除的不是目录-某/return(-3);if(i>=MSD+2)/某-没有这个文件或目录-某/return(-1);/某-判断要删除的目录有无子目录-某//某-要删除的目录起始地址-某/temp_dir=(tructdirect某)(fdik+cur_dir->directitem[i].ne某t 某DISKSIZE);for(j=2;jif(temp_dir->directitem[j].ne某t!=-1)break;}if(jreturn(-2);/某-有关联则报错,也可以采取级联删除,像Window-某//某------------找到起始盘块号,并将其释放----------------某/item=cur_dir->directitem[i].firtdik;fat[item].em_dik='0';/某-修改目录项-某/cur_dir->directitem[i].ign=0;cur_dir->directitem[i].firtdik=-1;trcpy(cur_dir->directitem[i].name,\cur_dir->directitem[i].ne某t=-1;cur_dir->directitem[i].property='0';cur_dir->directitem[i].ize=0;return0;}/某----------------------------------------------------------------------------------------------某//某-------------------------------显示当前目录的子目录-------------------------------------------某/voiddir(){inti;for(i=0;iif(cur_dir->directitem[i].firtdik!=-1)/某-如果存在子目录-某/{/某-其本身和父目录也算-某/printf(\if(cur_dir->directitem[i].property=='0')/某-文件-某/printf(\ele/某-目录-某/printf(\}}}/某----------------------------------------------------------------------------------------------某//某---------------------------------------更改当前目录-------------------------------------------某/intcd(char某name){inti,j,item;char某tr,某tr1;char某temp,某point,某point1;tructdirect某temp_dir;temp_dir=cur_dir;/某-先用临时目录代替当前目录-某/tr=name;/某-tr用来记录下次查找的起始地址-某/if(!trcmp(\如果输入\回根目录某/{cur_dir=root;trcpy(bufferdir,\return0;}j=0;for(i=0;iif(name[i]=='\\\\'){j++;if(j>=2){return-3;}}elej=0;}if(name[0]=='\\\\')/某如果最后一个是\去掉这个\{temp_dir=root;trcpy(bufferdir,\tr++;}if(tr[trlen(tr)-1]=='\\\\'){tr[trlen(tr)-1]='\\0';}tr1=trchr(tr,'\\\\');/某-找到'\\'字符的位置-某/temp=(char某)malloc(DIR_LENGTH某izeof(char));/某-为子目录的名字分配空间-某/while(tr1!=NULL)/某-找到-某/{for(i=0;itemp[i]=tr[i];}temp[i]='\\0';for(j=2;jif(!trcmp(temp_dir->directitem[j].name,temp))break;}if(j>=MSD+2)/某-不在当前目录-某/return(-1);item=temp_dir->directitem[j].firtdik;temp_dir=(tructdirect某)(fdik+item某DISKSIZE);/某-计算当前目录物理位置-某/tr=tr1+1;tr1=trchr(tr,'\\\\');//free(temp);}tr1=tr1+trlen(tr);for(i=0;ifor(j=0;jif(!trcmp(temp_dir->directitem[j].name,temp))break;}free(temp);/某释放申请的临时空间某/if(temp_dir->directitem[j].property!='1')/某-打开的不是目录-某/return(-2);if(j>=MSD+2)/某-不在当前目录-某/return(-1);item=temp_dir->directitem[j].firtdik;/某-当前目录在磁盘中位置-某/temp_dir=(tructdirect某)(fdik+item某DISKSIZE);if(!trcmp(\{if(cur_dir->directitem[j-1].ign!=1)/某-如果子目录不是根目录-某/{point=trchr(bufferdir,'\\\\');while(point!=NULL){point1=point+1;/某-减去'\\'所占的空间,记录下次查找的起始地址-某/point=trchr(point1,'\\\\');}某(point1-1)='\\0';/某-将上一级目录删除-某/}ele{}}eleif(!trcmp(\{bufferdir=bufferdir;/某-如果是当前目录则不变-某/}ele{if(name[0]!='\\\\')bufferdir=trcat(bufferdir,\修改当前目录-某/bufferdir=trcat(bufferdir,name);}cur_dir=temp_dir;/某-将当前目录确定下来-某/return0;}/某----------------------------------------------------------------------------------------------某//某---------------------------------------显示当前路径-------------------------------------------某/voidhow(){printf(\}/某----------------------------------------------------------------------------------------------某//某--------------------------------------输出提示信息--------------------------------------------某/voidprint(){printf(\退出文件系统halt\\n\printf(\创建文件create文件名\\n\printf(\删除文件del文件名\\n\printf(\打开文件open文件名\\n\printf(\关闭文件cloe文件名\\n\printf(\写文件write\\n\printf(\读文件read\\n\\n\printf(\创建子目录mkdir目录名\\n\printf(\删除子目录rmdir目录名\\n\printf(\显示当前目录的子目录dir\\n\printf(\更改当前目录cd目录名\\n\}/某----------------------------------------------------------------------------------------------某//某------------------------------------------主函数----------------------------------------------某/intmain(){FILE某fp;charch;chara[100];charcode[11][10];charname[10];inti,flag,r_ize;char某contect;contect=(char某)malloc(MA某_WRITE某izeof(char));if((fp=fopen(\如果还没有进行格式化,则要格式化某/{printf(\canf(\if(ch=='y'){initfile();printf(\}ele{//return;}}enter();print();how();/某将命令全部保存在CODE数组中某/trcpy(code[0],\trcpy(code[1],\trcpy(code[2],\trcpy(code[3],\trc py(code[4],\trcpy(code[5],\trcpy(code[6],\trcpy(code[7],\trcpy(c ode[8],\trcpy(code[9],\trcpy(code[10],\while(1){canf(\for(i=0;i<11;i++){if(!trcmp(code[i],a))break;}witch(i){cae0://某--退出文件系统--//free(contect);halt();//return;cae1://某--创建文件--//canf(\flag=create(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}eleif(flag==-4){printf(\}eleif(flag==-5){printf(\}ele{printf(\}how();break;cae2://--打开文件--//canf(\fd=open(name);if(fd==-1){ printf(\}eleif(fd==-2){printf(\}eleif(fd==-3){printf(\}eleif(fd==-4){printf(\}ele{printf(\}how();break;cae3://--关闭文件--//canf(\flag=cloe(name);if(flag==-1){ printf(\}ele{printf(\}how();break;cae4:/某--写文件--某/if(fd==-1){printf(\}ele{printf(\canf(\flag=write(fd,contect,trlen(contect));if(flag==0){ printf(\}ele{printf(\}}how();break;cae5:/某--读文件--某/if(fd==-1){printf(\}ele{flag=read(fd,contect);if(flag==-1){printf(\}ele{//printf(\for(i=0;iprintf(\}printf(\}}how();break;cae6://某--删除文件--canf(\flag=del(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}ele{printf(\}how();break;cae7://某--创建子目录--/canf(\flag=mkdir(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}eleif(flag==-4){printf(\}eleif(flag==-5){printf(\}eleif(flag==-6){printf(\}eleif(flag==0){printf(\}how();break;cae8://某--删除子目录--/canf(\flag=rmdir(name);if(flag==-1){ printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}eleif(flag==0){printf(\}how();break;cae9://某--显示当前子目录--/dir();how();break;cae10:/某--更改当前目录--某/canf(\flag=cd(name);if(flag==-1) {printf(\}eleif(flag==-2){printf(\}eleif(flag==-3){printf(\}how();break;default:printf(\how();}}}。