




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验内容 为linux系统设计一个简单的二级文件系统。实现了一下命令:login 用户登陆 dir 列文件目录 create 创建文件delete 删除文open 打开文件close 关闭文件read 读文件write 写文件。同时实现了文件保护功能,文件种类分三种:保护、只读、读写。保护文件不能读写、打开,只读只能读,不能写,不能删除。读写可以读取、写入、删除。2、设计思路:首先创建一个512k的文件,文件的前2k用来存放整个磁盘文件的组织情况,接下来的1k用来存放用户信息,第4k到第53k用来存放用户的文件信息,其余的459k用来给用户创建文件使用。如图:2k:存放磁盘信息。前48个字节为:000000002047002048003071003072054271054272524287,用来表示磁盘分配,每6个一组,单位是byte。剩下的用来存放459k的使用情况,格式为块数3位+使用情况(0/1),共459*4个,如第0块格式为:0000。在48+459*4之后的空间中的150字节,表示用户块的使用情况,格式为块数2位+使用情况(0/1),如第一块为010或011。1k:存放用户信息,共50个。用户信息组织如下:用户名(6)+密码(12)+分配的文件信息块(2),共20位。50k:存放文件信息:文件组织情况如下:文件名(9)+长度(4)+模式(1)+占用地址(2*3:文件最多占两块,每块地址为3位)共20位,如果该块已经被分配,那么该块最后一位置1。459k:1k为一个文件块,共459k。3、具体实现:在程序开始运行时,先读取文件的前48个字节的信息,获取个个分区的起止位置,然后根据获得的位置信息读取存放用户信息的那1k,并按着格式把用户信息组成对象,放入存储的用户信息的set实例userset中。同时读取记录给用户存放文件信息的块的150个字节,读取这个是为新用户注册分配空间做准备。然后进入用户登录程序,当用户登录成功后,获得给该用户分配的存放文件信息块的索引,将块中的相应的信息存入filesarr数组中,并组成文件对象,放入到fileinitset中。login:用户登录,用户登录时,首先检查在userset中有没有该用户名,如果有就比对密码,如果比对成功,就登录成功。如果比对失败,就提示密码错误。如果用户名不存在,就进入创建用户的程序,比对两次输入密码是否相同,如果两次密码相同,为用户分配空间,创建用户,把用户信息加入用户对应的集合中。 create:文件创建,创建文件时首先输入文件名,文件名输入完之后程序和已有文件比对,如果存在,提示,然后退出文件创建程序。如果不存在,则输入其他的信息,所有信息输入完之后创建文件。首先比对文件长度,如果文件长度小于1024,获取1个文件空间,并把空间的标志位置1,前三位用000补成6位,然后创建文件对象,加入到文件集合中,并把文件信息直接写入到文件对应的位置中,如果大于1024,则获取两个空间,前一个空间地址和后一个空间地址组成6位,其余的和小于1024的相同。 delete:删除文件,删除文件时先要检查该文件是不是被打开,如果为打开状态,则提示要先关闭文件。否则把符合条件的文件在文件集合中删除,并在对应的用户的文件记录数组中中清除该文件的信息,最后在对应的位置写入1024或2048个空格。dir:文件列表,这个功能就是把文件集合中的所有的元素遍历并打印一遍。open/close:打开、关闭文件,打开文件就是把符合条件的文件(只读、读写类型的文件)的相应信息存到一个集合中,即程序中的statusset集合,关闭文件就是把对应的文件在statusset集合中移除。read/write:读、写文件,当输入要读的文件名时,先要和已经打开的文件进行比对,如果存在就通过文件内容的物理地址读取相关文件的内容,如果不存在提示要先打开。写文件的逻辑和读文件基本相同,但是多了一个检查文件类型的步骤,即只用为读写类型的文件才可以写。写的时候会覆盖原文件内容。同时还要判读原文件内容和新内容,如果原文件长度小于1024,新文件内容大于1024,那么就得分配新的空间,修改文件地址。反之则要释放空间。show:显示已经打开的文件,执行这个命令时系统会把statusset集合中所有的对象遍历并打印一遍。help:帮助,打印系统能够执行的命令及其功能。save:保存文件,执行命令时系统会把userset和fileinitset等信息转换为字符数组,写回到文件中。exit:退出系统,退出系统时调用save方法,执行完之后退出。4、源码:/osfile.javapublic class osfile private string fpaddr; /* 文件物理地址 */private string flength; /* 文件长度 */private int fmode; /* 文件模式:1-保护;2-只读;3-读写 */private string fname; /* 文件名 */public osfile() this.fmode = 2;public string getfpaddr() return fpaddr;public void setfpaddr(string fpaddr) this.fpaddr = fpaddr;public string getflength() return flength;public void setflength(string flength) this.flength = flength;public int getfmode() return fmode;public void setfmode(int fmode) this.fmode = fmode;public string getfname() return fname;public void setfname(string fname) this.fname = fname;overridepublic string tostring() return fname + flength + fmode + fpaddr;overridepublic boolean equals(object obj) boolean flag = false;osfile osfile = (osfile) obj;if (osfile.getfname().equals(this.getfname() flag = true;return flag;/user.javaimport java.io.serializable;public class user implements serializable /* * */private static final long serialversionuid = 1l;private string name; /* 用户名 */private string password; /* 密码 */private string userblock;private string confirmpassword; /* 确认密码 */public string getconfirmpassword() return confirmpassword;public void setconfirmpassword(string confirmpassword) this.confirmpassword = confirmpassword;public user(string name, string password) super(); = name;this.password = password;public string getuserblock() return userblock;public void setuserblock(string userblock) this.userblock = userblock;public user() super();public string getname() return name;public void setname(string name) = name;public string getpassword() return password;public void setpassword(string password) this.password = password;overridepublic string tostring() return user name= + name + , password= + password + , userblock=+ userblock + ;overridepublic boolean equals(object obj) user user = (user) obj;if (user.getname().equals(this.getname()& user.getpassword().equals(this.getpassword() return true; else return false;/osfile_status.javapublic class osfile_status private osfile file; /* 文件 */private int status; /* 状态 */public osfile_status(osfile file, int status) super();this.file = file;this.status = status;public osfile_status() super();public osfile getfile() return file;public void setfile(osfile file) this.file = file;public int getstatus() return status;public void setstatus(int status) this.status = status;overridepublic boolean equals(object obj) boolean flag = false;osfile_status file_status = (osfile_status) obj;if (file_status.getfile().getfname().equals(this.getfile().getfname() flag = true;return flag;overridepublic string tostring() return osfile_status file= + file + , status= + status + ;/filesystem.javaimport java.io.bufferedreader;import java.io.console;import java.io.file;import java.io.filenotfoundexception;import java.io.fileoutputstream;import java.io.ioexception;import java.io.inputstreamreader;import java.io.randomaccessfile;import java.util.hashset;import java.util.iterator;import java.util.set;public class filesystem private randomaccessfile raf = null;private static int diskstart = 0;private static int diskend = 0;private static int contentstart = 0;private static int contentend = 0;private static int spacestart = 0;private static int spaceend = 0;private static int userstart = 0;private static int userend = 0;private static final string str = 000000002047002048003071003072054271054272524287; / 磁盘初始信息private static byte disktotalarr = new byte1024 * 512; / 存放磁盘全部信息private static byte diskinitarr = new byte48; / 存放磁盘初始信息private static byte usersinfoarr = new byte1024; / 存放用户信息private static byte filecontentindexarr = new byte150; / 存放用户块对应的信息private static byte filecontentarr = new byte1024; / 用户块 存放文件索引信息/ 一个用户一块private static byte spaceindexarr = new byte459 * 4; / 在开头的2k中,存放磁盘的信息。private static byte spacearr = new byte1024; / 存放文件内容private console console = null;private static set statusset = null; /* 存放打开的文件 */private static set userset = null; /* 存放用户信息 */private static set fileinitset = null; /* 存放文件信息 */private final static string diskfile = d:disk; /* 模拟磁盘文件 */private static filesystem fs = new filesystem();public static filesystem getinstance() return fs;private filesystem() private string formatfreespace(integer i, string result) stringbuilder strbuilder = new stringbuilder(i.tostring();if (strbuilder.length() 3) for (int j = 0; j 3 - strbuilder.length() + 1; j+) strbuilder.insert(0, 0);if (result = null) result = new string(strbuilder); else result = result + new string(strbuilder);stringbuilder builder = new stringbuilder(result);builder.append(0);result = new string(builder); else if (strbuilder.length() = 3) strbuilder.append(0);result = result + new string(strbuilder);return result;private string formatcontent(integer i, string result) stringbuilder strbuilder = new stringbuilder(i.tostring();if (strbuilder.length() 2) for (int j = 0; j 2 - strbuilder.length() + 1; j+) strbuilder.insert(0, 0);if (result = null) result = new string(strbuilder); else result = result + new string(strbuilder);stringbuilder builder = new stringbuilder(result);builder.append(0);result = new string(builder); else if (strbuilder.length() = 2) strbuilder.append(0);result = result + new string(strbuilder);return result;/* 初始化磁盘 */private void initdisk() for (int j = 0; j 1024 * 512; j+) disktotalarrj = ;string resultfreespace = null;string resultcontent = null;for (integer i = 0; i 459; i+) resultfreespace = formatfreespace(i, resultfreespace);for (integer i = 0; i 50; i+) resultcontent = formatcontent(i, resultcontent);try fileoutputstream out = new fileoutputstream(d:/disk);byte b = (str + resultfreespace + resultcontent).getbytes();for (int i = 0; i b.length; i+) disktotalarri = bi;out.write(disktotalarr);out.close(); catch (filenotfoundexception e) e.printstacktrace(); catch (ioexception e) e.printstacktrace();private string getusersstr(set userset) string str = null;iterator i = userset.iterator();while (i.hasnext() user temp = new user();temp = i.next();if (str = null) str = temp.getname() + temp.getpassword() + temp.getuserblock(); else str = str + temp.getname() + temp.getpassword()+ temp.getuserblock();return str;private string getosfilesstr(set filesset) string str = null;iterator i = filesset.iterator();while (i.hasnext() osfile temp = new osfile();temp = i.next();if (str = null) str = temp.getfname() + temp.getflength() + temp.getfmode()+ temp.getfpaddr(); else str = str + temp.getfname() + temp.getflength()+ temp.getfmode() + temp.getfpaddr();return str;private void save(user user) string userstr = this.getusersstr(userset);string filestr = this.getosfilesstr(fileinitset);if (filestr = null) filestr = new string();for (int i = 0; i 1024; i+) filecontentarri = ;byte b1 = filestr.getbytes();for (int i = 0; i b1.length; i+) filecontentarri = b1i;byte b = userstr.getbytes();for (int i = 0; i b.length; i+) usersinfoarri = bi;try raf.seek(48);raf.write(spaceindexarr, 0, spaceindexarr.length);raf.write(filecontentindexarr, 0, filecontentindexarr.length);raf.seek(2048);raf.write(usersinfoarr, 0, 1024);raf.seek(3072 + long.parselong(user.getuserblock().trim() * 1024);raf.write(filecontentarr, 0, filecontentarr.length);system.out.println(信息已保存.); catch (ioexception e) e.printstacktrace();system.out.print(this.getpath(user);public void run() this.initbeforelogin();this.login();private string getfreeuserblock() string str = new string();stringbuilder sb = null;int index;for (index = 2; index 48; index = index + 3) if (filecontentindexarrindex = 48) sb = new stringbuilder(char) filecontentindexarrindex - 2);sb.append(char) filecontentindexarrindex - 1);filecontentindexarrindex = 49;break;while (sb.length() 2) sb.insert(0, 0);str = new string(sb);return str;/* 在登录之前初始化一部分信息,为登录做准备 */private void initbeforelogin() stringbuilder sb = new stringbuilder();string diskstr = null;string userstr = null;stringbuilder sb1 = new stringbuilder();string result = new string50;file file = new file(diskfile);if (file.exists() try raf = new randomaccessfile(d:disk, rw);raf.readfully(diskinitarr, 0, 48);raf.seek(1884);raf.readfully(filecontentindexarr, 0, 150);raf.seek(2048);raf.readfully(usersinfoarr, 0, 1024); catch (filenotfoundexception e) e.printstacktrace(); catch (ioexception e) e.printstacktrace();for (int i = 0; i 1024; i+) sb.append(char) (usersinfoarri);userstr = new string(sb);for (int i = 0; i 48; i+) sb1.append(char) diskinitarri);diskstr = new string(sb1);string s = diskstr.substring(0, 6);diskstart = integer.parseint(s);diskend = integer.parseint(diskstr.substring(6, 12);userstart = integer.parseint(diskstr.substring(12, 18);userend = integer.parseint(diskstr.substring(18, 24);contentstart = integer.parseint(diskstr.substring(24, 30);contentend = integer.parseint(diskstr.substring(30, 36);spacestart = integer.parseint(diskstr.substring(36, 42);spaceend = integer.parseint(diskstr.substring(42, 48);userset = new hashset();for (int j = 0; j 50; j+) resultj = userstr.substring(j * 20, j * 20 + 20);for (int k = 0; k 50; k+) string str1 = resultk;if (str1.substring(0, 1).equals( ) return; else user temp = new user();temp.setname(str1.substring(0, 6);temp.setpassword(str1.substring(6, str1.length() - 2);temp.setuserblock(str1.substring(str1.length() - 2,str1.length();userset.add(temp); else this.initdisk();try raf = new randomaccessfile(d:disk, rw);raf.readfully(diskinitarr, 0, 48);raf.seek(1884);raf.readfully(filecontentindexarr, 0, 150);raf.seek(2048);raf.readfully(usersinfoarr, 0, 1024); catch (filenotfoundexception e) e.printstacktrace(); catch (ioexception e) e.printstacktrace();for (int i = 0; i 1024; i+) sb.append(char) (usersinfoarri);userstr = new string(sb);for (int i = 0; i 48; i+) sb1.append(char) diskinitarri);diskstr = new string(sb1);string s = diskstr.substring(0, 6);diskstart = integer.parseint(s);diskend = integer.parseint(diskstr.substring(6, 12);userstart = integer.parseint(diskstr.substring(12, 18);userend = integer.parseint(diskstr.substring(18, 24);contentstart = integer.parseint(diskstr.substring(24, 30);contentend = integer.parseint(diskstr.substring(30, 36);spacestart = integer.parseint(diskstr.substring(36, 42);spaceend = integer.parseint(diskstr.substring(42, 48);userset = new hashset();for (int j = 0; j 50; j+) resultj = userstr.substring(j * 20, j * 20 + 20);for (int k = 0; k 50; k+) string str1 = resultk;if (str1.substring(0, 1).equals( ) return; else user temp = new user();temp.setname(str1.substring(0, 6);temp.setpassword(str1.substring(6, str1.length() - 2);temp.setuserblock(str1.substring(str1.length() - 2,str1.length();userset.add(temp);private string getpassword() console = system.console();char charpw = console.readpassword();return new string(charpw);/* 比对用户是否存在 */private boolean isuserexists(user user) boolean flag = false;if (userset = null) flag = false; else iterator iterator = userset.iterator();while (iterator.hasnext() user user1 = (user) iterator.next();if (user1.equals(user) flag = true;break;return flag;/* 比对用户名是否存在 */private boolean isusernameexists(user user) boolean flag = false;if (userset = null) flag = false; else iterator iterator = userset.iterator();while (iterator.hasnext() user user1 = (user) iterator.next();if (user1.getname().equals(user.getname() flag = true;break;return flag;/* 获得确认密码 */private string getcpassword(string password) string cpassword = null;system.out.print(请输入确认密码(不大于12):);cpassword = this.getpassword();if (!(cpassword.equals(password.trim() system.out.println(两次密码输入不同.);system.exit(0);if (cpassword.length() 12) stringbuilder sb = new stringbuilder(cpassword);for (int i = 0; i 6) system.out.print(用户名长度必须不大于6,请重新输入:);name = br.readline();system.out.print(请输入密码(不大于12):);password = this.getpassword();while (password.length() 12) system.out.print(密码长度必须不大于12,请重新输入:);password = this.getpassword();stringbuilder sbname = new stringbuilder(name);while (sbname.length() 6) sbname.append( );stringbuilder sbpassword = new stringbuilder(password);while (sbpassword.length() 12) sbpassword.append( );name = new string(sbname);password = new string(sbpassword);user.setname(name);user.setpassw
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年高级护理实践技能考试指南及模拟题集
- 大型活动志愿者招募致辞模板
- 2025年机动车检测面试高频题
- 2025年企业经营管理总监管理智慧考核试卷及答案解析
- 2025年美术教育教师水平测试试题及答案解析
- 2025年旅游规划师专业技能测验试题及答案解析
- 2025年税务师事务所招聘考试题目解析与指导
- 2025年检察官资格考试试题及答案解析
- 2025年文联会计准则考试模拟题及题库
- 课件中使用花括号
- 2023年山东水发集团有限公司招聘笔试题库及答案解析
- 全国2023年招商银行招银网络科技校园招聘考试模拟卷3套含答案详解
- YY/T 1745-2021自动粪便分析仪
- MT 220-1990煤矿用防爆柴油机械排气中一氧化碳、氮氧化物检验规范
- 燕窝工艺参考
- 班组施工任务单
- 斜拉桥主桥索塔施工监理实施细则
- 钢结构模块化安装施工方案
- 双氧水生产工艺简单简介
- KNS机器参数,干货
- 医院输血科技术人员绩效考核指标
评论
0/150
提交评论