操作系统作业-模拟文件管理系统
文末有源码
文章目录
1. 项目需求
1.1 基本任务
在内存中开辟一个空间作为文件存储器,在其上实现一个简单的文件系统。
退出这个文件系统时,需要该文件系统的内容保存到磁盘上,以便下次可以将其恢复到内存中来。
1.2 功能描述
- 文件存储空间管理可采取显式链接(如FAT)或者其他方法。(即自选一种方法)
- 空闲空间管理可采用位图或者其他方法。如果采用了位图,可将位图和FAT表合二为一。
- 文件目录采用多级目录结构。至于是否采用索引节点结构,自选。目录项目中应包含:文件名、物理地址、长度等信息。同学可在这里增加一些其他信息。
- 文件系统提供的操作:
- 格式化
- 创建子目录
- 删除子目录
- 显示目录
- 更改当前目录
- 创建文件
- 打开文件
- 关闭文件
- 写文件
- 读文件
- 删除文件
1.3 项目目的
- 熟悉文件存储空间的管理;
- 熟悉文件的物理结构、目录结构和文件操作;
- 熟悉文件系统管理实现;
- 加深对文件系统内部功能和实现过程的理解
2. 开发环境
- 开发环境: Windows 10
- 开发软件: Eclipse
- 开发语言: JavaSE (jdk1.8.0_241)
- 开发工具包: Swing
3. 项目结构
│ MyFileSystem.exe
│ MyFileSystem.jar
│ README.md
│ README.pdf
│ 模拟文件管理系统-设计方案报告.pdf
│
├─myFileSystem(模拟系统文件夹,请勿删除)
│ │ ReadMe.txt
│ │
│ ├─1
│ │ 1BitMap&&Fat.txt
│ │ recover.txt
│ │
│ ├─2
│ │ 2BitMap&&Fat.txt
│ │ recover.txt
│ │
│ ├─3
│ │ 3BitMap&&Fat.txt
│ │ recover.txt
│ │
│ ├─4
│ │ 4BitMap&&Fat.txt
│ │ recover.txt
│ │
│ ├─5
│ │ 5BitMap&&Fat.txt
│ │ recover.txt
│ │
│ ├─6
│ │ 6BitMap&&Fat.txt
│ │ mojito.txt
│ │ recover.txt
│ │
│ ├─7
│ │ 7BitMap&&Fat.txt
│ │ recover.txt
│ │
│ ├─8
│ │ 8BitMap&&Fat.txt
│ │ recover.txt
│ │
│ └─9
│ 9BitMap&&Fat.txt
│ recover.txt
│
└─src
├─image
│ document.png
│ folder.png
│
├─Java
│ Folder.java
│ myFiles.java
│ MyFileSystem.java
│ tableModel.java
│
└─myFileSystem
4. 系统分析
4.1 显示链接法
本文件系统中, 文件存储空间管理使用显示链接的方法,文件中的内容存放在磁盘不同的块中,每次创建文件时为文件分配数量合适的空闲块。每次写文件时按顺序将文件内容写在相应块中; 删除文件时将原先有内容的位置置为空即可。
4.2 位图、FAT表
磁盘空闲空间管理在位图的基础上进行改造,将存放磁盘上文件位置信息的FAT表与传统的位图进行结合,磁盘空闲的位置使用0
标识,放有文件的盘块存放文件所在的下一个盘块的位置,文件存放结束的盘块位置使用1
标识。
5. 系统设计及实现
5.1 组件设计
- 文件树:
Java.Swing.JTree
- 文件表:
Java.Swing.JTable
- 搜索板块
- 搜索框:
Java.Swing.JTextField
- 提示语:
Java.Swing.JLabel
- 按钮:
Java.Swing.JButton
- 搜索框:
- 详细信息展示条:
Java.Swing.JLabel
5.2 功能实现
5.2.1 创建文件
通过调用File
类的createFile()
来实现,创建后刷新FAT和位图,如果虚拟存储空间不够则会提示创建失败
JMenuItem createFileItem = new JMenuItem("新建文件");
createFileItem.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
DefaultMutableTreeNode node =(DefaultMutableTreeNode)
tree.getLastSelectedPathComponent();
myFiles temp = (myFiles) node.getUserObject();
int blokName = temp.getBlockName();
Folder currentBlock = folders.get(blokName - 1);
String inputValue;
double capacity;
JOptionPane inputPane = new JOptionPane();
inputPane.setPreferredSize(new Dimension(600, 600));
inputPane.setInputValue(JOptionPane.showInputDialog("文件名:"));
if (inputPane.getInputValue() == null) {
return;
}
inputValue = inputPane.getInputValue().toString();
inputPane.setInputValue(JOptionPane.showInputDialog("文件大小(KB):"));
if (inputPane.getInputValue() == null) {
return;
}
capacity = Double.parseDouble(inputPane.getInputValue().toString());
File newFile = new File(temp.getFilePath