操作系统设计一个二级文件系统报告
计算机操作系统课程设计_简单的二级文件系统
《操作系统》课程设计题目:设计一个简单二级文件系统专业:计算机科学与技术年级:文计091-1*名:***学号:200990514103指导教师:任满杰时间:2011-2012第二学期2012年9月1日一、设计内容1、可以实现下列几条命令。
Format 格式化Dir 列文件目录Create 创建文件Delete 删除文件Deldir 删除目录Open 打开文件Close 关闭文件Search 查询文件Copy 拷贝文件Cut 剪切文件二、开发环境Windows操作系统Microsoft Visual C++三、分析设计(一)实验原理通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。
文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。
1.程序执行流程图:2.数据块的分配和回收(二)程序结构设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。
并提代接口言方法供用户或程序调用。
(三)数据结构int physic[100]; //文件地址缓冲区int style=1; //文件的类型char cur_dir[10]="root"; //当前目录int search_i=0;struct command{char com[10];}cmd[20];struct block{int n; //空闲的盘快的个数int free[50]; //存放空闲盘快的地址int a; //模拟盘快是否被占用}memory[20449];struct block_super{int n; //空闲的盘快的个数int free[50]; //存放进入栈中的空闲块int stack[50]; //存放下一组空闲盘快的地址}super_block;struct node //i结点信息{int file_style; //i结点文件类型int file_length; //i结点文件长度int file_address[100]; //i结点文件的物理地址 char file_message[100];} i_node[640];struct dir //目录项信息{char file_name[10]; //文件名int i_num; //文件的结点号char dir_name[10]; //文件所在的目录} root[640];四.运行示例及结果分析菜单删除目录文件查询拷贝剪切五、程序实现详细程序请参见源文件, 在此只列举3点1、剪切文件程序片段:void cut(char *tmp,char *newname) {int i; //,jchar t[20];_strtime(t);for(i=0;i<640;i++)if(strcmp(newname,root[i].file_name)==0){break;}if(i==640){printf("目录不存在,不能剪切!\n");return;}for(i=0;i<640;i++){if(strcmp(tmp,root[i].file_name)==0){strcpy(root[i].dir_name,newname);strcpy(i_node[root[i].i_num].change_t,t);//printf("剪切成功!\n");//return;}}if(i==640)printf("文件不存在,执行失败!\n");}2.无文件查询程序片段:void search(char* filename){int sign=0;for(search_i=0;search_i<640;search_i++){if(strcmp(root[search_i].file_name,filename)==0) //查询文件中所在目录信息和当前目录信息相同的数据{sign=1;int k=root[search_i].i_num;printf("%s\t",root[search_i].file_name); //文件名printf(" %d\t",i_node[k].file_style); //文件的类型printf(" %d\t\t",i_node[k].file_length); //文件的长度printf("%s\n",root[search_i].dir_name); //文件所在的目录}}if (sign==0){printf("%s\n","未找到该文件!");}}六、心得与体会这次设计中遇到最难的问题就是拷贝功能的实现,由于之前没有接触过拷贝的原理,所以通过和同伴的讨论和试验,终于突发奇想的运用改变文件路径的源代码和创建文件相结合,终于实现了拷贝功能,能够将一个文件从一个目录拷贝到另一目录(即先移动过去然后再在原位置创建一个原文件),可是却无法拷贝到root根目录,为了解决这个问题,又在创建文件的程序里添加了一个判断是否为根目录的语句,可是后来又发现了真个系统存在重命名的问题。
操作系统课程设计--为linux系统设计一个简单的二级文件系统
操作系统课程设计报告题目: 为Linux系统设计一个简单的二级文件系统指导老师:时间:2021.8.30一课程设计的目的课程设计目的使学生熟悉文件管理系统的设计方法;加深对所学各种文件操作的了解及其操作方法的特点。
通过模拟文件系统的实现,深入理解操作系统中文件系统的理论知识, 加深对教材中的重要算法的理解。
同时通过编程实现这些算法,更好地掌握操作系统的原理及实现方法,提高综合运用各专业课知识的能力。
二课程设计的要求1.可以实现下列几条命令:login用户登录dir 列目录create创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护三算法设计本次二级文件系统主要分为五大模块,分别是用户登录模块、新建目录模块、新建文件模块、删除文件模块和读取文件模块。
用户登录成功后才可以进行其他模块的操作。
1 用户登录模块用户登录模块要求用户输入用户,当输入正确后才能进行其他模块操作,否则提示用户名不存在并询问用户是否用此名进行注册。
若用户名未满,则提示注册成功,否则提示用现有注册用户,进行登录,并返回到登录界面。
用户登录模块流程图如图1所示。
图1 用户登录模块流程图2新建文件模块新建文件模块是在用户出入create 指令后进行的,进入后会要求用户输入文件名,并判断文件名是否存在,若没有则在要求用户输入文件读写权限,否则重新输入新的文件名。
新建文件模块流程图如图2所示。
图2 新建文件流程图3 删除文件模块删除文件模块是根据用户鼠标右击时选择到的节点来确定要删除节点的名字与路径,然后判断该节点是目录还是文件。
若是文件则直接删除文件,若是目录则进入该目录再删除其全部文件。
删除文件模块流程图如图4所示。
图4 删除文件模块流程图4读取文件模块读取文件模块,要求用户要在文件打开的前提下,将磁盘中的内容读取到内存中。
操作系统课程设计--为LINUX设计一个简单的二级文件系统
操作系统课程设计--为LINUX设计一个简单的二级文件系统理工大学华夏学院课程设计课程名称操作系统课程设计题目为LINUX 设计一个简单的二级文件系统专业软件技术班级姓名成绩指导教师2011年1月17日至 2011年1月21日课程设计任务书设计题目:为LINUX 设计一个简单的二级文件系统设计目的:1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
2、提高学生的程序设计能力、提高算法设计质量与程序设计素质。
设计任务:(在规定的时间内完成下列任务)为LINUX 设计一个简单的二级文件系统。
要求做到以下几点:1、可以实现下列几条命令(至少4条)用户登录 Login列文件目录 Dir创建文件 Create删除文件 Delete打开文件 Open关闭文件 2、列目录时要列出文件名、物理地址、Close读文件保护码和文件长度。
Read写文件 3、源文件可以进行读写保护。
Write时间安排:1月 17日布置课程设计任务;分配题目后,查阅资料、准备程序;1月 18日,1月20 日上机调试程序、书写课程设计报告;1月21 日上午提交课程设计报告及相关文档。
地点:学校机房(具体见现代教育中心大屏幕安排)具体要求:1、课程设计报告按统一通用格式书写,具体格式要求请在网络上查阅2、每位学生应独立完成各自的任务且每天至少在设计室工作半天指导教师签名: 11年 1月 7日教研室主任(或责任教师)签名: 11年 1月 7 日 1.实现原理首先~实现Login用户登录~,用户名:zhaoran 密码:1234,必须登录成功才能进入文件系统进行查看~进入后~通过树状展示文件目录,默认文件目录是C:\Program Files,,右侧显示文件夹图标或者文件图标~选中节点鼠标右击弹出菜单~有新建目录~新建文件~删除文件~打开文件~属性菜单项~并分别实现其功能。
2.开发环境开发工具 MyEclipse 7.0开发语言 Java3.关键算法实现流程图3.1流程图登陆账号错误验证账号密码账号正确目录右键选择操作新建目录新建文件删除打开属性结束3.2具体算法代码3.2.1登陆模块public class Login extends JFrame {private static final long serialVersionUID = 1L; private JPanel jContentPane = null;private JLabel jLabel1 = null;private JLabel jLabel2 = null;private JLabel jLabel = null;private JTextField jTextField1 = null;private JPasswordField jPasswordField = null; private JButton jButton1 = null;private JButton jButton2 = null;private JTextField getJTextField1() {if (jTextField1 == null) {jTextField1 = new JTextField();jTextField1.setPreferredSize(new Dimension(10, 25)); jTextField1.setBounds(new Rectangle(183, 59, 169, 30));}return jTextField1;}private JPasswordField getJPasswordField() {if (jPasswordField == null) {jPasswordField = new JPasswordField();jPasswordField.setBounds(new Rectangle(183, 99, 169, 30)); jPasswordField.addKeyListener(newjava.awt.event.KeyAdapter(){public void keyPressed(java.awt.event.KeyEvent e){if(e.getKeyChar()==KeyEvent.VK_ENTER){test();}}});}return jPasswordField;}public static void main(String[] args) {SwingUtilities.invokeLater(new Runnable() {public void run() {Login thisClass = new Login();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); thisClass.setVisible(true);}});}public Login() {super();initialize();}private void initialize() {this.setSize(400, 250);Dimension d=Toolkit.getDefaultToolkit().getScreenSize(); Dimension fsize=this.getSize();this.setLocation((d.width-fsize.width)/2,(d.height-fsize.height)/2);this.setContentPane(getJContentPane());this.setTitle("二级文件系统");}private JButton getJButton2() {if (jButton2 == null) {jButton2 = new JButton();jButton2.setBounds(new Rectangle(218, 167, 90, 32)); "); jButton2.setText("取消jButton2.addActionListener(newjava.awt.event.ActionListener() {public void actionPerformed(java.awt.event.ActionEvent e){System.exit(0);}});}return jButton2;}private JPanel getJContentPane() {if (jContentPane == null) {jLabel = new JLabel();jLabel.setText("密码:");jLabel.setHorizontalAlignment(SwingConstants.CENTER);jLabel.setBounds(new Rectangle(27, 101, 132, 29));jLabel2 = new JLabel();jLabel2.setText("用户名:");jLabel2.setBounds(new Rectangle(27, 59, 133, 29));jLabel2.setHorizontalAlignment(SwingConstants.CENTER);jLabel2.setPreferredSize(new Dimension(10, 15));jLabel1 = new JLabel();jLabel1.setText("登陆界面");jLabel1.setFont(new Font("\u534e\u6587\u5b8b\u4f53", Font.BOLD, 24));jLabel1.setBounds(new Rectangle(0, 0, 389, 32)); jLabel1.setForeground(new Color(255, 0, 54));jLabel1.setHorizontalAlignment(SwingConstants.CENTER); jContentPane = new JPanel();jContentPane.setLayout(null);jContentPane.add(jLabel1, null);jContentPane.add(jLabel2, null);jContentPane.add(jLabel, null);jContentPane.add(getJTextField1(), null); jContentPane.add(getJPasswordField(), null); jContentPane.add(getJButton1(), null);jContentPane.add(getJButton2(), null);}return jContentPane;}private JButton getJButton1() {if (jButton1 == null) {jButton1 = new JButton();jButton1.setBounds(new Rectangle(79, 168, 84, 33)); jButton1.setText("确定");jButton1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {test();}});}return jButton1;}public void test(){if(jTextField1.getText().equals("zhaoran")&&String.valueOf(jPassword Field.getPassword()).equals("1234")){String aa[]={"aa","bb"};Contents.main(aa);setVisible(false);}else{JOptionPane.showMessageDialog(Login.this, "输入错误~~请重新输入~");}}}3.2.2新建文件目录private class newMenuAction implements ActionListener {public void actionPerformed(ActionEvent arg0) {try {String Name = JOptionPane.showInputDialog("创建目录名称:");if (!Name.equals("")) {TreePath path = tree.getSelectionPath();MutableTreeNode node = (MutableTreeNode) path.getLastPathComponent();DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); MutableTreeNode newNode = new DefaultMutableTreeNode(Name); tree.fireTreeExpanded(path);if (node.getAllowsChildren()) model.insertNodeInto(newNode, node, 0);else {JOptionPane.showMessageDialog(null, "不能给文件追加下级目录!"); return;}String fullPath = "";for (Object obj : path.getPath()) {String str = obj.toString();if (str.endsWith("\\"))str = str.substring(0, str.length() - 1);if (fullPath.equals(""))fullPath += str;elsefullPath += "\\" + str;}File parentDir = new File(fullPath);if (parentDir.isDirectory()) {File currentFile = new File(fullPath + "\\" + Name);currentFile.mkdir();}} else {JOptionPane.showMessageDialog(null, "文件名不能为空~"); }} catch (HeadlessException e) {e.printStackTrace();}}}3.2.3新建文件private class newFileAction implements ActionListener { public void actionPerformed(ActionEvent e) {TreePath tp = tree.getSelectionPath();String fullPath = "";for (Object obj : tp.getPath()) {String str = obj.toString();if (str.endsWith("\\"))str = str.substring(0, str.length() - 1);if (fullPath.equals(""))fullPath += str;elsefullPath += "\\" + str;}String FileName = JOptionPane.showInputDialog("创建文件名称:"); if (!FileName.equals(null)) {File f = new File(fullPath + "\\" + FileName);try {f.createNewFile();} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}} else {JOptionPane.showMessageDialog(null, "文件名不能为空~");}}}3.2.4删除功能private class MenuAction implements ActionListener {public void actionPerformed(ActionEvent e) {TreePath tp = tree.getSelectionPath();DefaultMutableTreeNode node = (DefaultMutableTreeNode) tp.getLastPathComponent();DefaultTreeModel dtm = (DefaultTreeModel) tree.getModel(); dtm.removeNodeFromParent(node);String fullPath = "";for (Object obj : tp.getPath()) {String str = obj.toString();if (str.endsWith("\\"))str = str.substring(0, str.length() - 1); if (fullPath.equals(""))fullPath += str;elsefullPath += "\\" + str;}File currentFile = new File(fullPath);if (currentFile.isFile())currentFile.delete();elsedeleteDir(currentFile);}}public static boolean deleteDir(File dir) { if (dir.isDirectory()) {String[] subDir = dir.list();for (String s : subDir) {deleteDir(new File(dir, s));}}return dir.delete();}3.2.5打开文件public class Open_File {public static void main(String[] args) {DemoWindow2 dw = new DemoWindow2("打开文件");Toolkit theKit = dw.getToolkit();Dimension wndSize = theKit.getScreenSize();dw.setBounds(wndSize.width/3,wndSize.height/3,wndSize.width/3,wndSize.height/3);dw.setVisible(true);}}class DemoWindow2 extends JFrame implements ActionListener, Runnable {private static final long serialVersionUID = 1L;JTextArea jta = new JTextArea();int v = ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED;int h = ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED;JScrollPane jsp = new JScrollPane(jta, v, h);JPanel jp1 = new JPanel();JButton jb = new JButton("打开文件");public DemoWindow2(String title) {super(title);jp1.add(jb);add(jsp);add(jp1, BorderLayout.SOUTH);jb.addActionListener(this);}public void actionPerformed(ActionEvent e) {new Thread(this).start();}public void run() {jta.setText("");JFileChooser jfc = newJFileChooser(System.getProperty("user.home"));jfc.setFileFilter(new TXTFilter());if (jfc.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { File file = jfc.getSelectedFile();if (file != null) {try {FileInputStream fis = new FileInputStream(file); ProgressMonitorInputStream pmis = new ProgressMonitorInputStream( this, "读取进度", fis);ProgressMonitor pm = pmis.getProgressMonitor();pm.setMillisToDecideToPopup(10);pm.setMillisToPopup(0);byte[] readbyte = new byte[10];while (pmis.read(readbyte) > 0) {jta.append(new String(readbyte, "GB2312"));Thread.sleep(10);if (pm.isCanceled()) {jta.append("\n\n终止读取文件~");}}pmis.close();} catch (Exception e) {System.out.println(e.getMessage()); }}}}}class TXTFilter extends FileFilter { public boolean accept(File f) {if (f.isDirectory()) {return true;}String[] filePostfix = { "txt" };for (String str : filePostfix) {if (getExtension(f).equals(str)) return true;}return false;}public String getDescription() {return "TXT文件(*.txt)";}public static String getExtension(File f) { String ext = "";String s = f.getName();int i = stIndexOf('.');if (i > 0 && i < s.length() - 1) {ext = s.substring(i + 1).toLowerCase();}return ext;}}3.2.6查看文件属性public class Proper extends JFrame {private static final long serialVersionUID = 1L; private JPanel jContentPane = null;private String fullPath;private JTextArea jTextArea = null;private JScrollPane jScrollPane = null;public Proper(String fullPath) {super();this.fullPath=fullPath;initialize();}private void initialize() {this.setSize(332, 221);Dimension d=Toolkit.getDefaultToolkit().getScreenSize();Dimension fsize=this.getSize();this.setLocation((d.width-fsize.width)/2, (d.height-fsize.height)/2); this.setContentPane(getJContentPane());this.setTitle("查看文件属性");this.setVisible(true);}private JPanel getJContentPane() {if (jContentPane == null) {jContentPane = new JPanel();jContentPane.setLayout(null);jContentPane.add(getJScrollPane());}return jContentPane;}private JScrollPane getJScrollPane() {if (jScrollPane == null) {jScrollPane = new JScrollPane();jScrollPane.setBounds(new Rectangle(3, 1, 319, 185));jScrollPane.setViewportView(getJTextArea());}return jScrollPane;}private JTextArea getJTextArea() {if (jTextArea == null) {jTextArea = new JTextArea();jTextArea.setBounds(new Rectangle(3, 1, 319, 185));jTextArea.setEditable(false);File currentFile = new File(fullPath);StringBuffer sb = new StringBuffer();if (currentFile.isDirectory())sb.append("文件夹路径:" + currentFile.getAbsolutePath() + "\n");elsesb.append("文件路径:" + currentFile.getAbsolutePath() + "\n");sb.append("是否可读:" + currentFile.canRead() + "\n");sb.append("是否可写:" + currentFile.canWrite() + "\n");if (!currentFile.isDirectory())sb.append("文件长度:" + currentFile.length() / (1024 * 1024) + "M\n");SimpleDateFormat s = new SimpleDateFormat("yyyy年MM月dd日HH小时mm分钟ss秒");sb.append("文件上次修改时间:" + s.format(newDate(stModified()))+ "\n");sb.append("文件是否被隐藏:" + currentFile.isHidden() + "\n");jTextArea.setText(sb.toString()); }return jTextArea;}4软件运行过程4.1登陆记主目录界面,默认为C盘,4.2新建目录newfiles4.3新建文件file4.4删除4.5打开文件4.6查看文件属性5(设计小结操作系统课程设计,自己通过查找资料、复习课本、编程调试,写实验报告等环节,进一步掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识与掌握。
操作系统课程设计二级文件系统
#include<stdio.h>#include<string.h>#include<stdlib.h>//#include <time.h>int N=0; //记录用户数目struct MFILE{ //文件表char filename[19];char content[1000];//char filecha_time[18];int fileflag;};struct DIR{ //目录表char dirname[19];MFILE file[100];int filenum;int coflag;//char dircha_time[18];};struct USER{ //用户表char name[5];char password[5];DIR dir[100];int dirnum;} user[10];int check(char* name,char* password,int &userlo);void enter_dir(int userlo);void show_dir(int userlo);int open_dir(int userlo,char* ch1,int &filelo);void create_dir(int userlo,char* ch1);void delete_dir(int userlo,char* ch1);void re_dirname(int userlo,char* ch1,char* ch2);void enter_file(int userlo,int filelo);void show_file(int userlo,int filelo);void open_file(int userlo,char* ch1,int filelo);void close_file(int userlo,char* ch1,int filelo);void read_file(int userlo,char* ch1,int filelo);void create_file(int userlo,char* ch1,char* ch2,int filelo); void delete_file(int userlo,char* ch1,int filelo);void re_filename(int userlo,char* ch1,char* ch2,int filelo);void add_filestr(int userlo,char* ch1,char* ch2,int filelo);//char* nowtime();void main(){FILE *fp=fopen("user.txt","r+");while(!feof(fp)){ //用户文件读入到用户顺序表char name[5];char password[5];fscanf(fp,"%s%s",name,password);strcpy(user[N].name,name);strcpy(user[N].password,password);user[N].dirnum=0;N++;}while(1){char name[19];char password[19];printf("请登录:\n");printf("用户名->");scanf("%s",name);printf("密码->");scanf("%s",password);int userlo; //用户标识if(check(name,password,userlo)==1){enter_dir(userlo);}else printf("用户名或密码错误!\n");}}int check(char* name,char* password,int &userlo){for(int i=0;i<N;i++){if(strcmp(user[i].name,name)==0&&strcmp(user[i].password,password)==0) {userlo=i;printf("登陆成功!\n");printf("输入help获得帮助列表\n");return 1;}elsei++;}return 0;}void enter_dir(int userlo){biaohao:while(1){char action[19];char ch1[19];char ch2[19];printf("->");if(scanf("%s",action)&&strcmp(action,"help")==0){printf("*****************************************\n"); //printf("* help 帮助!*\n");printf("* dir 显示目录!*\n");printf("* open name 打开目录!*\n");printf("* create 目录名创建新目录!*\n");printf("* delete 目录名删除目录! *\n");printf("* rename 旧名称新名称为目录重命名!*\n");printf("* quit 退出登陆!*\n");printf("*****************************************\n"); }else if(strcmp(action,"dir")==0){show_dir(userlo);}else if(strcmp(action,"quit")==0){break;}else if(strcmp(action,"open")==0){scanf("%s",&ch1);int filelo;if(open_dir(userlo,ch1,filelo)==0){printf("目录打开成功!\n");printf("输入help获得帮助列表\n");open_dir(userlo,ch1,filelo);enter_file(userlo,filelo);}elsegoto biaohao;}else if(strcmp(action,"create")==0){scanf("%s",&ch1);create_dir(userlo,ch1);}else if(strcmp(action,"delete")==0){scanf("%s",&ch1);delete_dir(userlo,ch1);}else if(strcmp(action,"rename")==0){scanf("%s%s",&ch1,&ch2);re_dirname(userlo,ch1,ch2);}else{printf("%s不是系统内部命令!\n",action); }}}void show_dir(int userlo){if(user[userlo].dirnum==0){printf("目录为空!\n");return;}printf("目录名\n");for(int i=0;i<user[userlo].dirnum;i++){//printf("%-26s\n",user[userlo].dir[i].dirname);printf(user[userlo].dir[i].dirname);printf(" \n");}}int open_dir(int userlo,char* ch1,int &filelo){for(int i=0;i<user[userlo].dirnum;i++){if(strcmp(user[userlo].dir[i].dirname,ch1)==0){user[userlo].dir[i].coflag=1;filelo=i;return 0;// printf("目录打开成功!\n");//printf("输入help获得帮助列表\n");}}printf("该目录不存在!\n");return 1;}void create_dir(int userlo,char* ch1){for(int i=0;i<user[userlo].dirnum;i++){if(strcmp(user[userlo].dir[i].dirname,ch1)==0){printf("有同名用户存在!\n");return;}}strcpy(user[userlo].dir[user[userlo].dirnum].dirname,ch1);user[userlo].dir[user[userlo].dirnum].coflag=0;user[userlo].dir[user[userlo].dirnum].filenum=0;user[userlo].dirnum++;printf("目录创建成功!\n");}void delete_dir(int userlo,char* ch1){int dflag=-1;for(int i=0;i<user[userlo].dirnum;i++){if(strcmp(user[userlo].dir[i].dirname,ch1)==0){dflag=i;break;}}if(dflag==-1){printf("该目录不存在!\n");}else{for(int j=i;j<user[userlo].dirnum-1;j++){strcpy(user[userlo].dir[j].dirname,user[userlo].dir[j+1].dirname);for(int k=0;k<user[userlo].dir[j+1].filenum;k++){strcpy(user[userlo].dir[j].file[k].filename,user[userlo].dir[j+1].file[k].filename);strcpy(user[userlo].dir[j].file[k].content,user[userlo].dir[j+1].file[k].content);user[userlo].dir[j].file[k].fileflag=user[userlo].dir[j+1].file[k].fileflag;}user[userlo].dir[j].filenum=user[userlo].dir[j+1].filenum;user[userlo].dir[j].coflag=user[userlo].dir[j+1].coflag;}printf("删除成功!\n");user[userlo].dirnum--;}}void re_dirname(int userlo,char* ch1,char* ch2){for(int i=0;i<user[userlo].dirnum;i++){if(strcmp(user[userlo].dir[i].dirname,ch1)==0){for(int j=0;j<user[userlo].dirnum;j++){if(strcmp(user[userlo].dir[j].dirname,ch2)==0){printf("你更换的新目录名已经存在!");return;}}strcpy(user[userlo].dir[i].dirname,ch2);printf("重名名成功!\n");return;}}printf("无此目录!无法重命名!\n");}void enter_file(int userlo,int filelo){while(1){char action[19];char ch1[19];char ch2[19];printf("->");if(scanf("%s",action)&&strcmp(action,"help")==0){printf("---------------------———————————\n");//printf("* help 帮助!*\n");printf("- dir 显示文件列表!-\n");printf("- open 文件名打开文件!-\n");printf("- read 文件名读取文件!-\n");printf("- create 文件名文件内容创建新文件!-\n");printf("- delete 文件名删除文件! -\n");printf("- rename 旧文件名新文件名为文件重命名!-\n");printf("- addstr 文件名更新内容更新文件!-\n");printf("- ... 返回上一层!-\n");//printf("- quit 退出登陆!-\n");printf("----------------------———————————\n");}else if(strcmp(action,"dir")==0){show_file(userlo,filelo);}// else if(strcmp(action,"quit")==0)// {// break;// }else if(strcmp(action,"...")==0){break;}else if(strcmp(action,"open")==0){scanf("%s",&ch1);open_file(userlo,ch1,filelo);}else if(strcmp(action,"close")==0){scanf("%s",&ch1);close_file(userlo,ch1,filelo);}else if(strcmp(action,"read")==0){scanf("%s",&ch1);read_file(userlo,ch1,filelo);}else if(strcmp(action,"create")==0){//scanf("%s%s",&ch1,&ch2);scanf("%s\n",&ch1);scanf("%s",&ch2);create_file(userlo,ch1,ch2,filelo);}else if(strcmp(action,"delete")==0){scanf("%s",&ch1);delete_file(userlo,ch1,filelo);}else if(strcmp(action,"rename")==0){scanf("%s%s",&ch1,&ch2);re_filename(userlo,ch1,ch2,filelo);}else if(strcmp(action,"addstr")==0){scanf("%s%s",&ch1,&ch2);add_filestr(userlo,ch1,ch2,filelo);}else{printf("%s不是系统内部命令!\n",action);return;}}}void show_file(int userlo,int filelo){if(user[userlo].dir[filelo].filenum==0){printf("无文件!\n");return;} printf("文件名\n");for(int i=0;i<user[userlo].dir[filelo].filenum;i++){printf("%-26s",user[userlo].dir[filelo].file[i].filename);//printf("%-26s\n",user[userlo].dir[filelo].file[i].filecha_time);}}void open_file(int userlo,char* ch1,int filelo){for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){if(user[userlo].dir[filelo].file[i].fileflag==1){printf("该文件已经打开!\n");return;}else{user[userlo].dir[filelo].file[i].fileflag=1;printf("打开成功!\n");return;}}}printf("该文件不存在!\n");}void close_file(int userlo,char* ch1,int filelo){for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){ if(user[userlo].dir[filelo].file[i].fileflag==0){printf("该文件未打开!\n");return;}else{user[userlo].dir[filelo].file[i].fileflag=0;return;}}}printf("你要关闭的文件文件不存在!\n");}void read_file(int userlo,char* ch1,int filelo){for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){ if(user[userlo].dir[filelo].file[i].fileflag==0){printf("请先打开该文件,然后在读取!\n");return;}else{printf("%s\n",user[userlo].dir[filelo].file[i].content);return;}}}printf("该文件不存在!");return;}void create_file(int userlo,char* ch1,char* ch2,int filelo){for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){printf("有同名文件存在!\n");return;}}printf("输入内容\n");//strcpy(user[userlo].dir[filelo].file[user[userlo].dir[filelo].filenum].filecha_time,nowtime());strcpy(user[userlo].dir[filelo].file[user[userlo].dir[filelo].filenum].filename,ch1);strcpy(user[userlo].dir[filelo].file[user[userlo].dir[filelo].filenum].content,ch2);user[userlo].dir[filelo].file[user[userlo].dir[filelo].filenum].fileflag=0;user[userlo].dir[filelo].filenum++;printf("文件创建成功\n");}void delete_file(int userlo,char* ch1,int filelo){int mflag=-1;for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){mflag=i;break;}}if(mflag==-1){printf("该文件不存在!\n");}else{if(user[userlo].dir[filelo].file[mflag].fileflag==1){printf("删除前请先关闭文件");return;}else{for(int j=i;j<user[userlo].dir[filelo].filenum-1;j++){strcpy(user[userlo].dir[filelo].file[j].filename,user[userlo].dir[filelo].file[j+1].filename); //strcpy(user[userlo].dir[filelo].file[j].filecha_time,user[userlo].dir[filelo].file[j+1].filecha_time);strcpy(user[userlo].dir[filelo].file[j].content,user[userlo].dir[filelo].file[j+1].content);user[userlo].dir[filelo].file[j].fileflag=user[userlo].dir[filelo].file[j+1].fileflag;}printf("删除成功!\n");user[userlo].dir[filelo].filenum--;}}}void re_filename(int userlo,char* ch1,char* ch2,int filelo){for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){for(int j=0;j<user[userlo].dir[filelo].filenum;j++){if(strcmp(user[userlo].dir[filelo].file[j].filename,ch2)==0){printf("你要更换的新文件名已经存在!\n");return;}}strcpy(user[userlo].dir[filelo].file[i].filename,ch2);//strcpy(user[userlo].dir[filelo].file[i].filecha_time,nowtime());printf("重名名成功!\n");return;}}printf("无此文件!无法重命名!\n");}void add_filestr(int userlo,char* ch1,char* ch2,int filelo){for(int i=0;i<user[userlo].dir[filelo].filenum;i++){if(strcmp(user[userlo].dir[filelo].file[i].filename,ch1)==0){if(user[userlo].dir[filelo].file[i].fileflag==0){printf("请先打开文件再进行更新!\n");return;}else{strcat(user[userlo].dir[filelo].file[i].content,ch2);//strcpy(user[userlo].dir[filelo].file[i].filecha_time,nowtime());printf("更新成功!\n");return;}}}printf("无此文件!无法更新!\n");}//char* nowtime(){// time_t t = time(0);// char tmp[64];// strftime( tmp, sizeof(tmp), "%Y/%m/%d %X",localtime(&t) ); // return (char*)tmp;//}。
操作系统课程设计文件管理二级文件系统
本文档分别包含linux和windows两套程序目录一、课程设计的目的..........................二、课程设计的内容及要求...................内容..........................................要求..........................................三、实现原理.................................四、关键算法实现流程图 .....................流程图........................................关键算法......................................五、软件运行环境及限制 .....................六.结果输出及分析..........................七.心得体会.................................八.参考文献.................................一.课程设计的目的本课程设计是学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让我更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强了我的动手能力。
二.课程设计的内容及要求内容:为LINUX 设计一个简单的二级文件系统。
要求做到以下几点:1、可以实现下列几条命令(至少4条)。
Login 用户登录Dir 列文件目录Create 创建文件Delete 删除文件Open 打开文件Close 关闭文件Read 读文件Write 写文件2、列目录时要列出文件名、物理地址、保护码和文件长度。
3、源文件可以进行读写保护。
从课程设计的目的出发,通过设计工作的各个环节,达到以下教学要求:1、鼓励并优先个人独立选题设计,可从下面设计题目中选择,也可以自拟相关题目;如要合作,每组最多两名同学,且设计文档不能相同;2、可以在我们实验课最后布置的实验设计基础上进行完善和改进,但不能相同。
二级文件管理课程设计报告书
操作系统二级文件管理课程设计课程设计名称:二级文件管理系统专业班级:学生姓名:学号指导老师:一、设计目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。
二、设计内容为linux系统设计一个简单的二级文件系统。
要求做到以下几点:(1)可以实现下列几条命令(至少4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件rename 重命名(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。
三、程序设计1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2、文件物理结构可采用显式链接或其他方法。
3、磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5、设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、重命名、退出。
四、源代码1、FileSystem.h#define DIR_LENGTH 1024 //路径最长可达100字节#define MAX_WRITE 1024*128 //写入文字可达128k字节#define MEM_D_SIZE 1024*1024 //1M磁盘空间#define DISKSIZE 1024 //磁盘块的大小1K#define MSD 5 //最大子目录数5#define DISK_NUM MEM_D_SIZE/DISKSIZE //磁盘块数目1024=1M/1K #define FATSIZE DISK_NUM*sizeof(struct FatItem) //FAT表大小1024*8=8K#define MOFN 5 //最大文件打开数5#define ROOT_DISK_NO FATSIZE/DISKSIZE+1 //根目录起始盘块号9#define ROOT_DISK_SIZE sizeof(struct Direct) //根目录大小196#define LOGIN 15#define NAME_LONG 1#define NOT_EXSIT -1#define NOT_OPEN -1#define DIR_FULL -2#define OPEN_FULL -3#define ALREADY -4#define NOT_R_W -4#define DISK_FULL -5#define NOT_EXIT -1struct FatItem // size 8{ int item; //存放文件下一个磁盘的指针char em_disk; //磁盘块是否空闲标志位, 0 空闲};struct Direct{ struct FCB{ char name[8]; //文件/目录名8位char property; //属性1位目录0位普通文件int size; //文件/目录字节数、盘块数)int firstDisk; //文件/目录起始盘块号int next; //子目录起始盘块号int sign; //1是根目录0不是根目录}directItem[MSD+2]; //最大子目录 5};struct OpenTable{ struct OpenTableItem{ char name[9]; //文件名int firstdisk; //起始盘块号int size; //文件的大小char open_flag; //文件打开标志:'1':打开。
操作系统课程设计简单的二级文件系统
《操作系统》课程设计题目:设计一个简单二级文件系统专业:计算机科学与技术年级:文专计081—1姓名:张庆龙学号:0126指导教师:翟一鸣时间:2010年7 月15日一、设计内容1、可以实现下列几条命令。
Format 格式化Dir 列文件目录Create 创建文件Delete 删除文件Deldir 删除目录Open 打开文件Close 关闭文件Search 查询文件Copy 拷贝文件Cut 剪切文件二、开发环境Windows操作系统Microsoft Visual C++三、分析设计(一)实验原理通过程序模拟Linux文件系统,用一个二进制文件(FileSystem.disk)来模拟磁盘.设计一个多用户的二级文件系经统、实现一般的创建文件、目录,删除文件、目录,切换目录,打开、关闭文件、读写文件等操作。
文件系统,包含格式化,显示文件(目录),创建文件等几个简单命令的实现,而且能完成超级块的读写,节点的读写等过程. 本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户账号下的文件。
另外,为了简单本文件系统未考虑文件共享、文件系统安全以及管道文件与设备文件等特殊内容。
1.程序执行流程图:2.数据块的分配和回收(二)程序结构设计FileSystem类负责管理磁盘空间和磁盘内存I节点,负责对磁盘空间和磁盘数据进行优化管理。
并提代接口言方法供用户或程序调用。
(三)数据结构int physic[100]; //文件地址缓冲区int style=1; //文件的类型char cur_dir[10]="root"; //当前目录int search_i=0;struct command{char com[10];}cmd[20];struct block{int n; //空闲的盘快的个数int free[50]; //存放空闲盘快的地址int a; //模拟盘快是否被占用}memory[20449];struct block_super{int n; //空闲的盘快的个数int free[50]; //存放进入栈中的空闲块int stack[50]; //存放下一组空闲盘快的地址}super_block;struct node //i结点信息{int file_style; //i结点文件类型int file_length; //i结点文件长度int file_address[100]; //i结点文件的物理地址 char file_message[100];} i_node[640];struct dir //目录项信息{char file_name[10]; //文件名int i_num; //文件的结点号char dir_name[10]; //文件所在的目录} root[640];四. 运行示例及结果分析菜单删除目录文件查询拷贝剪切五、程序实现详细程序请参见源文件, 在此只列举3点1、剪切文件程序片段:void cut(char *tmp,char *newname){int i; //,jchar t[20];_strtime(t);for(i=0;i<640;i++)if(strcmp(newname,root[i].file_name)==0){break;}if(i==640){printf("目录不存在,不能剪切!\n");return;}for(i=0;i<640;i++){if(strcmp(tmp,root[i].file_name)==0){strcpy(root[i].dir_name,newname);strcpy(i_node[root[i].i_num].change_t,t);//printf("剪切成功!\n");//return;}}if(i==640)printf("文件不存在,执行失败!\n");}2.无文件查询程序片段:void search(char* filename){int sign=0;for(search_i=0;search_i<640;search_i++){if(strcmp(root[search_i].file_name,filename)==0) //查询文件中所在目录信息和当前目录信息相同的数据{sign=1;int k=root[search_i].i_num;printf("%s\t",root[search_i].file_name); //文件名printf(" %d\t",i_node[k].file_style); //文件的类型printf(" %d\t\t",i_node[k].file_length); //文件的长度printf("%s\n",root[search_i].dir_name); //文件所在的目录}}if (sign==0){printf("%s\n","未找到该文件!");}}六、心得与体会这次设计中遇到最难的问题就是拷贝功能的实现,由于之前没有接触过拷贝的原理,所以通过和同伴的讨论和试验,终于突发奇想的运用改变文件路径的源代码和创建文件相结合,终于实现了拷贝功能,能够将一个文件从一个目录拷贝到另一目录(即先移动过去然后再在原位置创建一个原文件),可是却无法拷贝到root根目录,为了解决这个问题,又在创建文件的程序里添加了一个判断是否为根目录的语句,可是后来又发现了真个系统存在重命名的问题。
《操作系统》二级文件操作
4)为了模拟linux的通过i节点查找文件的磁盘块地址,我的设计的查找用户文件的物理地址的思路如下:“user.txt”相当于linux中的目录,用户登陆时首先从中找到自己的名字即i节点(相当于找到了node里面自己的用户文件),然后再查找该文件,即可以找到文件的磁盘块地址。
//将文件读入结构fileTable中
FILE *fp;
if ((fp = fopen(q2, "r")) == NULL) {
printf("error1\n");
exit(0);
}
fread(fileTable, sizeof(struct node), used1, fp);
fclose(fp);
2)在程序文件夹下有个名为“file”的系统根目录,此目录下包括:一个名为“user.txt”的文件,记录所有注册过的帐号及密码;一个名为“node”的文件夹:“node”文件夹中存有用户文件(以用户名作为文件名),内容为每个用户所创建的文件的文件名及其物理地址;一个名为“root”的文件夹:.里面可以存放超级管理员创建的文件,超级管理员有查看现有用户和删除用户的权利。
{
strcpy(fileTable[i].fileName, fileTable[i + 1].fileName);
strcpy(fileTable[i].number, fileTable[i + 1].number);
}
used1--;
//将更改后的fileTable的内容写入文件,文件即进行了更新。
//对结构fileTable里面的内容(文件名和物理地址)进行修改
操作系统课程设计报告文件系统
盘索引结点号一并组成一个新目录项,记入其父目录文件中。
文件被撤消时,系统要回收该文件的磁盘索引结点,从其父目录中删除该目录项。
随着文件的打开与关闭,系统还要为之分派和回收内存索引结点。
②磁盘索引结点中,包括有关文件的下述一系列信息:文件模式di_mode、文件所有者用户标识符di_uid、同组用户标识符di_gid、文件长度di_size、文件的联接计数di_nlink、文件的物理地址di_addr、文件的访问时刻di_atime、文件的修改时刻di_mtime和文件的成立时刻di_citime。
③内存索引结点:文件被打开后,系统为它在内存索引结点表区中建一内存索引结点,以方便用户和系统对文件的访问。
④磁盘索引结点的分派与回收分派进程ialloc:当内核创建一新文件时,要为之分派一空闲磁盘i结点。
如分派成功,便再分派一内存i结点。
其进程如下:检查超级块上锁否。
由于超级块是临界资源,诸进程必需互斥地访问它,故在进入ialloc后,要先检查它是不是已上锁,若是则睡眠等待;检查i结点栈空否。
若i结点栈中已无空闲结点编号,则应从盘中再调入一批i 结点号进栈。
若盘中已无空闲i结点,则犯错处置,返回;从空闲i结点编号栈中分派一i结点,并对它初始化、填写有关文件的属性;分派内存i结点;将磁盘i结点总数-1,置超级块修改标志,返回。
回收进程ifree:当删除文件时,应回收其所占用的盘块及相应的磁盘i结点。
具体有:检查超级块上锁否。
若是,直接返回,即不把本次回收的i结点号记入空闲i结点编号栈中;检查i结点编号栈满否。
若已满,无法再装入新回收的i结点号,当即返回,若未满,便将回收的i结点编号进栈,并使当前空闲结点数+1;置超级块修改标志,返回。
⑤内存索引结点的分派与回收分派进程iget:虽然iget用在打开文件时为之分派i结点,但由于允许文件被共享,因此,若是一文件已被其他用户打开并有了内存i结点,则现在只需将i结点中的引用计数+1。
操作系统课程设计报告Linux二级文件系统设计
操作系统课程设计报告Linux二级文件系统设计操作系统课程设计报告专业:计算机科学与技术学号:********姓名:***提交日期:2021-3-8操作系统课程设计报告【设计目的】(1)本实验的目的就是通过一个直观多用户文件系统的设计,增进认知文件系统的内部功能和内部同时实现。
(2)结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统。
(3)通过分后对实际问题的分析、设计、编程同时实现,提升学生实际应用领域、编程的能力【设计内容】二级文件系统设计【实验环境】c++/vc++【相关知识综述】1.背景知识(1)外存管理文件系统就是一个所含大量的文件及其属性,对文件展开操作方式、管理的软件,以及向用户提供更多采用文件的USB的一个子集。
在逻辑上它的层次结构就是这样的:文件系统USB对对象的操作方式和管理的软件子集逻辑文件系统基本i/o管理程序(文件组织模块)基本文件系统(物理i/o层)i/o掌控层(设备驱动程序)对象及其属性表明做为产品的操作系统存有各自的文件系统。
比如说ms的windows系列采用的就是fat16、fat32或ntfs的文件系统、linux采用的就是ext2、ext3文件系统等等。
(2)linux的ext2文件系统linux使用一个叫虚拟文件系统的技术从而可以支持多达几十种的不同文件系统,而ext2是linux自己的文件系统。
它有几个重要的数据结构,一个是超级块,用来描述目录和文件在磁盘上的物理位置、文件大小和结构等信息。
inode也是一个重要的数据结构。
文件系统中的每个目录和文件均由一个inode描述。
它包含:文件模式(类型和存取权限)、数据块位置等信息。
一个文件系统除了重要的数据结构之外,还必须为用户提供有效的接口操作。
比如ext2提供的open/close接口操作。
(3)用内存来模拟外存真正的文件系统对外存有展开管理,牵涉至许多硬件、设备管理方面的底层技术,一方面这些技术不属于操作系统核心内容,一方面过多的内容不免导致实验者顾此失彼,所以这里所推荐一种采用内存去演示外存的方式,可以UX21LI2677E这些硬件技术而轻易把精力放到数据结构设计和操作方式算法设计上面。
操作系统的课程设计Linux二级文件资料系统设计完整篇.doc
操作系统的课程设计Linux二级文件资料系统设计1操作系统课程设计报告专业:软件工程学号:姓名:马提交日期:2017/1/10【设计目的】1、通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能和内部实现2、结合数据结构、程序设计、计算机原理等课程的知识,设计一个二级文件系统,进一步理解操作系统3、通过对实际问题的分析、设计、编程实现,提高学生实际应用、编程的能力【设计内容】为Linux系统设计一个简单的二级文件系统。
要求做到以下几点:1.可以实现下列几条命令:login 用户登录dir 列目录create 创建文件delete 删除文件open 打开文件close 关闭文件read 读文件write 写文件cd 进出目录2.列目录时要列出文件名,物理地址,保护码和文件长度3.源文件可以进行读写保护【实验环境】C++DevCpp【设计思路】本文件系统采用两级目录,其中第一级对应于用户账号,第二级对应于用户帐号下的文件。
另外,为了简便文件系统未考虑文件共享,文件系统安全以及管道文件与设备文件等特殊内容。
首先应确定文件系统的数据结构:主目录、子目录及活动文件等。
主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。
用户创建的文件,可以编号存储于磁盘上。
如:file0,file1,file2…并以编号作为物理地址,在目录中进行登记。
结构体:typedef struct /*the structure of OSFILE*/{int fpaddr; /*file physical address*/int flength; /*file length*/int fmode; /*file mode:0-Read Only;1-Write Only;2-Read and Write; 3-Protect;*/char fname[MAXNAME]; /*file name*/} OSFILE; //存放重要信息typedef struct /*the structure of OSUFD*/{char ufdname[MAXNAME]; /*ufd name*/OSFILE ufdfile[MAXCHILD]; /*ufd own file*/}OSUFD; //用户下面的文件typedef struct /*the structure of OSUFD'LOGIN*/{char ufdname[MAXNAME]; /*ufd name*/char ufdpword[8]; /*ufd password*/} OSUFD_LOGIN;typedef struct /*file open mode*/{int ifopen; /*ifopen:0-close,1-open*/int openmode; /*0-read only,1-write only,2-read and write,3-initial*/ }OSUFD_OPENMODE;主要的函数说明:void LoginF(); /*LOGIN FileSystem用户登录*/void DirF(); /*Dir FileSystem列目录*/void CdF(); /*Change Dir改变目录*/void CreateF(); /*Create File创建文件*/void DeleteF(); /*Delete File删除文件*/void ModifyFM(); /*Modify FileMode修改*/void OpenF(); /*Open File打开文件*/void CloseF(); /*Close File关闭文件*/void ReadF(); /*Read File读文件*/void WriteF(); /*Write File写文件*/void QuitF(); /*Quit FileSystem离开文件系统*/void help();其他重要函数:void clrscr() //清屏int ExistD(char *dirname) /*Whether DirName Exist,Exist-i,Not Exist-0*/ int ExistF(char *filename) /*Whether FileName Exist,Exist-i,Not Exist-0*/ int FindPANo() /*find out physical address num*/void SetPANo(int RorW) /*Set physical address num,0-read,1-write*/void InputPW(char *password) /*input password,use '*' replace*/char *ltrim(char *str) /*remove the heading blanks.去除左空白*/char *rtrim(char *str) /*remove the trailing blanks.去除右空白*/int WriteF1() /*write file相当于置换文件*/程序流程说明:整体流程:各部分功能流程:Open:N NY操作系统的课程设计Linux二级文件资料系统设计1第2页【源程序清单】Open:void OpenF() /*Open File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示当前路径int fcoun, i; //定义两个整形变量char fname[MAXNAME], fmode[25]; //定义两个字符串变量int fmod; //文件模式printf("\nPlease input FileName:");gets(fname); //接收打开文件的文件名ltrim(rtrim(fname)); //去除左右空白if(ExistF(fname){ //不存在printf("\nError.文件名\'%s\'不存在\n", fname);wgetchar=1;} else { //存在i=ExistD(username); //获取用户物理信息for(int a=0; a {if(strcmp(fname, ufd[i]->ufdfile[a].fname)==0) //找到文件{fcoun=a;break;}}ifopen[i][fcoun].ifopen=1; //将文件状态置为打开状态printf("Please input OpenMode(0-Read Only, 1-Write Only, 2-Read and Write,3-Protect):");//打开文件模式gets(fmode); //获取模式fmod=atoi(fmode); //将字符串转换为整型ifopen[i][fcoun].openmode=fmod; //将文件的模式置为OpenModeprintf("\nOpen Successed");wgetchar=1;}}Delete:void DeleteF() /*Delete File*/{printf("\n\nC:\\%s>",strupr(dirname)); //显示路径char fname[MAXNAME], str[50], str1[50]; //定义三个字符串变量int i, k, j;int fpaddrno1; //记录文件物理地址块号if(strcmp(strupr(ltrim(rtrim(dirname))), "")==0){ //判断主目录是否为空printf("\nError.请确认您要删除的是否在用户目录下!\n");wgetchar=1;}if(strcmp(strupr(dirname), strupr(username))!=0){ //判断用户是否在用户目录下printf("\nError.您只能删除修改自己用户目录下的文件哦!\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("\n Error.\'%s\' 处于打开状态!请先关闭哟!\n", fname); wgetchar=1;} else {if(ufd[k]->ufdfile[i].fmode==3){ //保护文件,不可删除printf("\nError.\'%s\'处于被保护状态!请先关闭哟!\n", fname);wgetchar=1;} else {fpaddrno1=ufd[k]->ufdfile[i].fpaddr; //获取文件的物理地址块号fpaddrno[fpaddrno1]=0; //回收物理地址块号for(j=i; jufd[k]->ufdfile[j]=ufd[k]->ufdfile[j+1]; //将j+1位置为j}strcpy(str , "c:\\osfile\\file\\");itoa(fpaddrno1, str1, 10); //将整数转化为字符串strcat(str, str1);strcat(str, ".txt"); //连接remove(str); //删除物理文件fcount[k--]; //文件个数减一。
操作系统二级文件管理系统结构设计
操作系统二级文件管理系统结构设计二级文件管理系统是一种较为常见的操作系统文件管理结构,主要用于管理计算机中的文件和目录。
该系统结构设计的目标是提供高效、可靠和安全的文件管理功能,使用户能够方便地存储、访问和管理文件。
一、文件系统的基本结构1.文件系统层次结构:二级文件管理系统采用层次结构,由两个层次组成:目录层和文件层。
目录层用于组织、分类和管理文件,文件层用于存储和读取实际文件数据。
2.目录结构设计:目录是文件和子目录的逻辑组织结构,可以有多级嵌套。
目录层次结构可以采用树形结构,根目录是顶级目录,下级目录称为子目录。
每个目录包含目录项,每个目录项包含文件名和文件指针。
3.文件结构设计:文件是存储在磁盘上的一组数据,可以是文本文件、图像文件、音频文件等。
文件层次结构可以采用线性结构,每个文件由文件头、文件数据和文件尾组成。
文件头包含文件属性信息,文件数据是实际的文件内容,文件尾用于标记文件结束。
二、文件系统的实现原理1.文件分配方法:文件分配方法指定了文件在磁盘上的存储方式。
常见的文件分配方法有连续分配、链接分配和索引分配。
连续分配将文件存储在连续的磁盘块上,链接分配使用链表将文件块链接起来,索引分配使用索引表记录文件块的位置。
2.目录操作:目录操作包括创建目录、删除目录、重命名目录、进入目录和返回上级目录等。
其中进入目录操作是进入子目录进行文件管理,返回上级目录是返回到父目录中。
3.文件操作:文件操作包括创建文件、删除文件、读取文件和写入文件等。
创建文件时需要为文件分配存储空间,并在目录中添加文件项;删除文件时需要释放文件占用的存储空间,并在目录中删除文件项;读取文件和写入文件是对文件数据的操作,读取时将文件数据输出到终端,写入时将终端输入的数据写入到文件中。
三、文件系统的实现考虑因素1.效率:文件系统应提供高效的操作方法,包括目录和文件的操作。
目录的层次结构应使查找操作能够在较短的时间内完成,文件的分配方法应尽量减少磁盘碎片和提高文件存取速度。
操作系统课程设计Linux二级文件系统设计
操作系统课程设计 - Linux二级文件系统设计1. 介绍本文档旨在描述操作系统课程的设计内容,具体地,是讲解如何设计一个Linux二级文件系统。
本文档将分别从整体架构、数据结构和算法、API设计以及测试等方面进行阐述。
2. 整体架构Linux二级文件系统的整体架构如下图所示:+-----------+ +-----------------------+| | | || VFS | -> | 具体的文件系统实现 || | | |+-----------+ +-----------------------+其中,VFS(Virtual File System)是Linux内核中的虚拟文件系统,为所有文件系统提供了一个统一的访问接口。
具体的文件系统实现则是针对具体的文件系统类型而定制的,例如ext4、NTFS等。
3. 数据结构和算法Linux二级文件系统设计中,最核心的问题是如何组织文件和目录。
在Linux 中,文件和目录都是通过inode(索引节点)来表示的。
每一个inode都包含了文件或目录的属性(如文件类型、访问权限、文件大小等)以及指向文件数据块的指针。
因此,在设计文件系统时,需要考虑如何合理地组织inode,以实现高效的文件访问。
常用的文件组织方式有:•线性组织:将所有的inode按顺序存储在磁盘上,文件数据也按照顺序存储在相邻的磁盘块中。
这种方式的优点是简单直接,缺点则是容易产生磁盘碎片,导致文件访问效率低下。
•索引结构:为文件增加一个索引块,将文件数据块的指针存储在索引块中。
这种方式的优点是磁盘利用率高,易于维护,但对于小文件来说,可能会造成内存浪费。
在具体实现时,需要根据实际的场景来选择不同的数据结构和算法。
例如,对于大型多媒体文件,可以采用多级索引结构,以提高数据访问效率。
4. API设计设计好数据结构和算法后,就需要考虑如何提供统一的API接口给应用程序使用。
一个好的API设计需要考虑多方面的因素,例如易用性、可扩展性、安全性等。
闽 南 师 范 大 学 操作系统课程设计 模拟一个简单二级文件管理系统
闽南师范大学操作系统课程设计模拟一个简单二级文件管理系统姓名:学号:系别:计算机学院专业:网络工程年级:指导教师:全秀祥、闫格年月日一、课程设计项目介绍项目介绍:通过研究Linux的文件系统结构,模拟设计一个简单二级文件管理系统,第一级为主目录文件,第二级为用户文件。
磁盘空间分配表,采用链表结构,每个节点保存成模拟磁盘的一个逻辑块的信息,包括块的最大长度,文件占用长度,占用标志。
如果占用标志为0,即该空间可分配给文件。
初始化磁盘空间分配表链表,首先把整个模拟磁盘作为一块,并置占用位为0。
当有进程申请磁盘空间时,从头开始遍历,检查占用位,如果该块可分配,则检查块大小,若块长度大于或等于申请空间大小,则把块的前一部分(等于申请大小)分配给文件,并置标志位为占用。
剩下的大小作为一个新块,作为一个新节点插入到节点的后边,标志位为可用。
这样就实现了模拟磁盘的线性分配。
设计目的:通过具体的文件存储空间的管理、文件的物理结构、目录结构和文件操作的实现,加深对文件系统内部功能和实现过程的理解。
进行操作系统课程设计主要是在学习操作系统课程的基础上,在完成操作系统各部分实验的基础上,对操作系统的整体进行一个人模拟,通过实践加深对各个部分的管理功能的认识,还能进一步分析各个部分之间的联系,最后达到对完整系统的理解。
同时,可以提高运用操作系统知识解决实际问题的能力,锻炼实际的编程能力,创新能力及团队组织、协作开发软件的能力,还能提高调查研究,查阅技术文献,资料以及编写软件设计文档的能力。
通过编程实现这些算法,更好地掌握了操作系统的原理及实现方法,提高综合运用各专业课知识的能力,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统地设计和实现思路,并了解操作系统的发展动向和趋势。
最重要的是,能提高自己实际动手操作能力和独立思考能力,让我们受益匪浅。
二、总体设计此二级文件管理系统包含的功能包括:登录到文件管理系统,创建文件,打开文件,关闭文件,删除文件,写文件,读文件,创建目录,删除目录,修改目录表,显示目录信息。
操作系统课程设计为LINUX设计一个简单的二级文件系统
操作系统课程设计为LINUX设计一个简单的二级文件系统一.项目概述本课程设计旨在通过设计一个简单的多用户文件系统,加深学生对文件系统内部功能及内部实现的理解,并提高学生的程序设计能力、算法设计质量与程序设计素质。
二.设计题目为LINUX设计一个简单的二级文件系统,要求实现以下命令:Login用户登录、Dir列文件目录、Create创建文件、Delete删除文件、Open打开文件、Close关闭文件、Read读文件、Write写文件。
列目录时需包括文件名、物理地址、保护码和文件长度。
源文件需进行读写保护。
三.开发语言及实现平台或实验环境本课程设计的开发语言为C语言,实现平台为Linux操作系统。
学生需要在规定时间内完成程序的编写和调试,并书写课程设计报告。
四.时间安排1月17日布置课程设计任务,学生需要自行查阅资料并准备程序。
1月18日至1月20日,学生需要在机房上机调试程序,并书写课程设计报告。
1月21日上午,学生需要提交课程设计报告及相关文档。
每位学生应独立完成各自的任务,每天至少在设计室工作半天。
五.具体要求1.课程设计报告应按统一通用格式书写,具体格式要求请在网络上查阅。
2.指导教师和教研室主任(或责任教师)需要在规定时间内签署相应的文件。
设计目的:本设计旨在开发一款能够实现某种功能的程序,为用户提供便利。
设计内容:5.1.该程序将包括两个主要功能:A和B。
A功能将执行某种操作,而B功能将提供用户界面,使其能够轻松地使用A功能。
5.2.此外,该程序还将包括其他辅助功能,例如C和D。
这些功能将提高程序的可用性和实用性。
任务:该程序的主要任务是为用户提供一种方便、高效的解决方案,使其能够更轻松地实现某种目标。
主程序流程图:程序的主要流程将包括以下步骤:用户打开程序,选择所需的功能,程序执行相应的操作,最终将结果返回给用户。
程序设计:6.1.在程序设计方面,我们将采用一种灵活、可扩展的架构,以便能够轻松地添加新的功能和模块。
二级文件系统设计报告
一.设计目的:通过课程设计, 加深对操作系统各资源管理模块的理解,掌握操作系统的基本原理及功能, 具有初步分析实际操作系统、设计、构造和开发现代操作系统的基本能力。
(1)掌握linux文件系统的基本原理、结构和实现方法。
(2)掌握linux文件系统中文件的建立、打开、读/写、执行、属性等系统调用的使用(3)学会设计简单的文件系统并实现一组操作(4)通过实验学习文件系统的系统调用命令,提高文件系统实现功能的理解和掌握。
二.设计内容:题目:多用户文件系统模拟设计要求:1.在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。
2.文件物理结构可采用显式链接或其他方法。
3.磁盘空闲空间的管理可选择位示图或其他方法。
如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。
4.文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。
5.设计一个较实用的用户界面,方便用户使用。
要求提供以下相关文件操作:(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建: create (4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close (8)删除文件:delete (9)创建目录(建立子目录):mkdir(10)改变当前目录:cd (11)列出文件目录:dir(12)退出:logout三.设计过程1、实现功能(1)具有login (用户登录)(2)系统初始化(建文件卷、提供登录模块)(3)文件的创建: create(4)文件的打开:open(5)文件的读:read(6)文件的写:write(7)文件关闭:close(8)删除文件:delete (9)创建目录(建立子目录):mkdir(10)改变当前目录:cd(11)列出文件目录:dir(12)退出:logout2、添加功能用位示图的方法把内存的占用情况形象的显示出来,实现多级目录。
操作技巧系统设计一个二级文件系统报告
操作技巧系统设计一个二级文件系统报告操作系统(2014年秋季学期)实验报告系别:计算机科学与技术班级:信安12-1班姓名:***学号:0710*******实验名称:进程调度总成绩:评语:日期:三、实验设计说明(写你实验相关的设计,别写这么少,多写点。
)本次实验采用C语言模拟二级文件系统,可以在多用户环境下实现用户的创建、查询、登录、删除,和文件的添加、删除、打开、关闭、读、写等基本操作,很好地模拟了操作系统对文件的管理过程。
四、实验设计的流程图(写你实验相关的设计流程图,下面的流图是有问题的。
开始选择用户是否要创建新文输入文件名等信息;显示已经完成操作的信息进行该用户的下个操做直到退出该用户权限选择操作命令及命令对象文件Y件显示已经元成操作的信息Nstruct file ten [10]={{ "k1" ,0,10,0},{ "k2" ,2,10,0},{"k3" ,1,10,0},{"k4" ,2,10,0},{"k5" ,2,10,0},{"k6" ,2,10,0},{"k7" ,1,10,0},{"0" ,0,0,0},{"0" ,0,0,0},{ "0" ,0,0,0}}; struct file UFD10];struct file AFD[5]={{ "0" ,0,0,0},{ "0" ,0,0,0},{"0" ,0,0,0},{"0" ,0,0,0},{"0" ,0,0,0}};///////////////////////////////////////////////////////////////struct user use[10]={{ "number1" , one},{ "number2" , two},{ "number3" , three },{ "number4" , four }, {"number5" , fine },{ "number6" , six },{ "number7" , seven},{ "number8" , eight },{ "number9" , nine }, {"number10" , ten }}; struct user MFD1]={{ "0" ,0}};/////////////////////////////////////////////////////////////////// void running (); void delet (); void write ();; void open(); void close (); void bye (); void r ead(); void create (); void in put ();/////////////////////////////////////////////////////////////////// using namespace std ; void main() { in put (); running ();cout <<"操作己结束"<<="">///////////////////////////////////////////////////////////// void running () { char order ;int i ;cout <<="" p="">for (i =0; i <10; i ++) {cout v<<"\t"<="" p="">}cout<<<"************************************************************* *************‘‘="" <<"请选择操作命令(输入代号):<="" cout="" p="">cout <<"c-create d-deleteo-ope n s-close r-read w-write b-bye t.exit(重选用户)"<<="" p=""><<="" p=""><<="" p="">I************************************************************** *************“ <<="" p="">switch (order ){case 'c':create (); break ; case 'd': delet ());break ;case 'o': ope n(); break ; case 's': close () );break ; case 'r' read (); break ; case 'w': write ());break ;case 'b': bye(); break ;case 't': in put () );break ;default : cout << "输入命令出错,请重输cin >>order ; "<<="" ;="" <}///////////////////////////////////////////////void ope n(){ char nam&10];int i ,j , flag ;if (count ==5){ cout <<"运行文件队列己满"<<="" p="">running ();}else{ do{ cout <<"请输入文件名:"<<="" p="">cin >>nameflag =0;for (i =0; i <10; i ++){ if (strcmp (UF^i]. name nam?) // 如果没有这个文件{ flag =1;//break;}else{ flag =0;break ;}}if (flag ==1)cout <<"无此文件,请重新输入"<<="" p="">} while (flag ==1);for (j =0;j <5;j ++){ if (strcmp (AFDj]. name nam?) // 如果没有这个文件flag =1; else{ flag =0;break ;}}if (flag ==1)for (j =0;j <5;j ++){ if (! strcmp (AFD[j ]. name "0")){ AFDj]=UFDi ];cout <<"文件己打开"<<="" p="">cou nt ++;break ;}}else cout <<"该文件己经在打开队列中"<<="" p=""> cout <<="" p="">running ();}}////////////////////////////////////////////////void close (){ char nam&10];int j , flag ;cout <<"请输入文件名:"<<="" p="">cin >>nameflag =0;for (j =0;j <5;j ++){ if (strcmp (AFDj]. name nam?) // 如果没有这个文件{flag =1;//break;}else{ flag =0;strcpy (AFDj]. name "0" ); // 清空文件AFDj ]. code=0;AFDj ]. pwrite =0;AFDj ]. size =0;cout <<"运行队列中的该文件己被关闭"<<="" p=""> break ;}}if (flag ==1)cout <<"运行队列中无此打开的文件,请重新操作"<<="" < running ();}//////////////////////////////////////////////void bye(){ int i , j ;for (i =0; i <5; i ++){ for (j =0; j <10; j ++){ if (! strcmp (AFD[ i ]. name UFDj ]. nam?){ UFtDi ]= AFD[i ];break ;}}}cout <<"文件目录己保存"<<="" p="">cout <<="" p="">}//////////////////////////////////////////void read (){ char nam&10];int j , flag =0;cout <<"请输入文件名:"<<="" p="">cin >>namefor (j =0;j <5;j ++){if (! strcmp (AFD[j ]. name nam?) // 如果AFC有这个文件{ flag =1; break ;}}if (flag ==1)if (AFDj]. code==0|| AFDj]. code==2){ AFDj]. pwrite ='R';cout <<"文件的状态是正在读"<<="" p="">}else cout <<"无权限写此文件"<<="" p="">else{ cout <<"运行队列中无此文件,请先打开文件"<<="">cout <<="" p="">running ();}////////////////////////////////////////////////////////{ cout <<"文件名重复,请重新输入 "<<="" p="">flag =1; break; } }} while (flag ==1);for (i =0; i <10; i ++){ if (! strcmp (UFD i]. name "0" )) // 找到第一个空的文件 { strcpy ( UFD i ]. name nam?; do {cout <<"请输入保护码(选择-2,0-可读,-可写,-可读写):"<>UFD i ]. code; if (UFQi]. code!=0&&UFtp i ]. code!=1 &&UFtp i ]. code !=2) cout <<"输入错误,重新输入保护码"<<="" p="">}while (UFDi]. code!=0&&UFtpi]. code!=1 &&UFD i ]. code!=2); cout <<"请输入文件长度(选择数字) :"<<="" p=""> cin >>UFD i ]. size ;cout <<"己建立文件"v<<="">running ();} }/////////////////////////////////////////////////////////////////// ///////////////////////// void in put () { char name int i ;i <10; i ++) UFtp i ]= one[ i ]; MFE[0]= use[1];running (); break ; :i ++) UFtp i ]= two [ i ]; MFI[D]= use [1]; running (); break ; :i ++) UFtp i ]= three [ i ]; MFI[D]= use [2]; running (); break ;:i ++) UF[?i]=four [i ]; MF[[0]= use[3];running (); break ; running (); break ;i ++) UFtp i ]= seven [ i ]; MFD0]= use [6];running (); break ;cout<<<"************************************************************* ******************"<="" p=""><<="" p="">cout <<" 请选择以下用户名(输入数字): "<<="" p=""><<"1.one 2.two 3.three 4.four 5.fine 6.six7.seve n 8.eigh 9.nine 0.te n "<<<"************************************************************ *******************"="" <<"请输入用户名:";="" cin="" cout="">>name <<="" <{case '1'for (i =0; i case '2': for (i =0; i <10; case '3': for (i =0; i <10;case '4': for (i =0; i <10;case '5': for (i =0; i <10; case '6':for (i =0; i <10; case '7': for (i =0; i <10;running (); break ; switch ( nam? i++)UFDi]=fine [i ]; MFD0]= use[4]; i++)UFDi]=six [i ]; MFD0]= use [5];case 8 : for (i =0; i <10; i ++) UFDi]= eight [i ]; MFD0]= use [7]; running ();break ;case '9': for (i =0; i <10; i ++) UFD i ]= nine [ i ]; MFip0]= use[8]; running ());break ;case 'O': for (i =0; i <10; i ++) UFDi]=ten [i];MFD0]= use [9]; running ();break ;default cout <<"输入用户名岀错"<<="" ;="" i="" n="" p="" put="">五、编译过程截图(下面是一个例子,换上你自己的图).mil H WUSf VI U 目问 3_塀直] *D) IBID H 応⑻ ■口IW ■Sttl(M) -』>■ wmcWimh* y x IMFT X a▼:-z rid(银E?■ *rwddQ<■曲=V?X4M?巴筑n f 广i* M 凡皇祚名=气“洞]j.ajm eln>>riaD&r { 書?r 却交協f?r(j=flj j ,: 5, jM 1)NF*51XWif-1 1 右.1'. 1 ■ . |丫丄f la^=l . br&tk :1 I} if< p="">} 1| 4 ir (AE0[j].*c4?t=fl ATLfJl.tO*^)- 1卩帕序乜1曲嘤冒LwihHW 下耐⑻IM六、测试用例(下面是一个例子,换上你自己的)等等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
v .. . ..
. . . 资 料. .
操作系统(2014年秋季学期)
实 验 报 告
系别:计算机科学与技术 班级:信安12-1班 姓名:*** 学号:
实验名称:进程调度
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2022-4-26 2/17
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
2022-4-26 4/17
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
.
Word 资料
NORTH CHINA UNIVERSITY OF TECHNOLOGY
}
五、编译过程截图
(下面是一个例子,换上你自己的图)
六、测试用例
(下面是一个例子,换上你自己的)
文字叙述一下测试过程的实例。
如先创建用户***、再产生文件****、再打开文件****,再写入内容********,再退出,再打开用户***,再将文件读出,读出的内容应该是*******。
等等。
六、实验结果
(下面是一个例子,换上你自己的图,给出根据测试用例的截图)。