⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 filemanager.java

📁 基于java的文件系统管理实现。模拟操作系统对文件的管理
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		}
		return outPut;
	}

	/**
	 * This method initializes inPut	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getInPut() {
		if (inPut == null) {
			inPut = new JButton(icon7);
			inPut.setBounds(new Rectangle(10, 8, 50, 50));
			
			//将磁盘中的内容读入内存	
			inPut.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					String name=JOptionPane.showInputDialog(null,"请输入要读入的文件名: (需存放在与程序同一目录下)");
					sysOpen(name);  //将磁盘中的内容读入内存	
					JOptionPane.showMessageDialog(null,"读入系统的文件完毕!");
					System.out.println("actionPerformed()"); // TODO Auto-generated Event stub actionPerformed()
				}
			});
		}
		return inPut;
	}

	/**
	 * Launches this application
	 */
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				FileManager application = new FileManager();
				application.getJFrame().setVisible(true);
			}
		});
	}
	
	private DirStr[] dirCol = new DirStr[100];  //FCB数组
	private int[] spaces  = new int[100];  //位图与FAT表合一: -1 not used; 0-99 next block; 100 end;
	private String[] block = new String[100]; //物理块,与spaces数组一一对应
	private String curDirName;  //当前目录名称  //  @jve:decl-index=0:
	private int curDirPos;  //当前目录在FCB数组中的编号

	private JPanel sysPanel = null;

	private JScrollPane jTextlPane1 = null;

	private JButton outPut = null;

	private JButton inPut = null;

	private JLabel jLabel8 = null;

	private JLabel jLabel9 = null;

	//系统初始化
	public void go(){
		//所有变量初始化
		for(int i=0;i<100;i++)
		{
			dirCol[i] = new DirStr();
			spaces[i] = -1;
			block[i] =new String("");
		}
		dirCol[0].flag = "dir";
		dirCol[0].name = "H:";
		dirCol[0].upDir = 0;
		curDirName = dirCol[0].name;
		directory.setText(curDirName);
		curDirPos = 0;
		//test();
		tableRefresh(0);

	}
	
	//刷新视图(当前目录下的文件和子目录)
	public void tableRefresh(int a)  
	{
		rowData.clear();
		Integer tempDir;
		for(int i=0;i<dirCol[a].items.size();i++)
		{
			//将当前目录下的文件和子目录信息添加到表中
			Vector temp = new Vector();
			tempDir = (Integer) dirCol[a].items.elementAt(i);
			temp.add(dirCol[tempDir].name);	
			temp.add(dirCol[tempDir].flag);
			temp.add(dirCol[tempDir].size);
			rowData.add(temp);
		}
		//jTable.revalidate();
		jTable.updateUI();
	}
	
	//进入a目录
	public void goToDir(int a)
	{
		curDirPos = a;	//改变当前目录号
		
		//刷新视图
		tableRefresh(curDirPos);	
		curDirName = curDirName+"\\"+dirCol[a].name;
		directory.setText(curDirName);
	}
	
	//找到空闲的FCB,若满了,返回100
	public int findFreeFCB()
	{
		for(int i=1;i<100;i++)
		{
			if ( dirCol[i].upDir == -1 )
			{
				return i;
			}
		}
		return 100;
	}
	
	//创建文件
	public void createFile(String fileNew,int fileSize)
	{		
		
		int position = findFreeFCB();
		if (position == 100)
		{
			JOptionPane.showInputDialog(null,"FCB空间已满!");
		}
		else
		{
			dirCol[position].name = fileNew;
			dirCol[position].flag = "file";
			dirCol[position].upDir = curDirPos;
			dirCol[position].size = fileSize;
			
			int blockNum = fileSize / 1000 + 1;	//计算出当前文件需要多少个block存放
			int control = 0;
			int cur = -1;
			int next= -1;
			
			//根据文件需要的block分配空间给文件,同时更改空闲空间位图及FAT表
			cur = nextFreeBlock();
			spaces[cur] = cur;
			dirCol[position].position = cur;
			if (blockNum > 1)
			{
				while (control < blockNum-1)	//不停的分配空间给文件,同时更改空闲空间位图及FAT表
				{			
					next = nextFreeBlock();
					spaces[cur] = next;
					spaces[next] = next;
					cur = next;
					if (next == -1)	//存储空间已满
					{
						JOptionPane.showInputDialog(null,"存储空间已满!");
					}
					control++;
				}
			}	
			spaces[cur] = 100;  //表示当前块是最后一块
			
			dirCol[curDirPos].items.add(position);	//将当前文件添加到当前目录的文件索引中
			tableRefresh(curDirPos);
			
		}
		
	}
	
	//创建目录
	public void createDir(String name)
	{
		int position = findFreeFCB();
		if (position == 100)
		{
			JOptionPane.showInputDialog(null,"FCB空间已满!");
		}
		else
		{
			//原理同创建文件,但只需要修改FCB块
			dirCol[position].flag = "dir";
			dirCol[position].name = name;
			dirCol[position].upDir = curDirPos;
			
			dirCol[curDirPos].items.add(position);
			tableRefresh(curDirPos);
		}
	}
	
	//找到下一块空闲的物理块,若满了,返回-1
	public int nextFreeBlock()
	{
		for (int i=0;i<100;i++)
		{
			if (spaces[i] == -1)
			{
				return i;
			}
		}
		return -1;
	}
	
	//删除文件
	public void deleteFile(int i)
	{
		int next = dirCol[i].position;
		int cur;
		cur = next;
		while(spaces[cur] != 100)	//删除文件对应的存储空间,同时更新空闲空间位图及FCB表
		{
			block[cur] = "";
			next = spaces[cur];
			spaces[cur] = -1;
			cur = next;
		}
		block[cur] = "";
		spaces[cur] = -1;
		
		dirCol[curDirPos].items.remove((Object)i);  //将当前文件从到当前目录的文件索引中删除
		dirCol[i].clear();   //FCB清零
		
	}
	
	//删除目录
	public void deleteDir(int position)
	{
		int tempDir;
		for(int i=0;i<dirCol[position].items.size();i++)	//对当前目录下的每一个文件
		{
			tempDir = (Integer) dirCol[position].items.elementAt(i);
			if(dirCol[tempDir].flag.equals( "file"))	//若为文件
			{
				deleteFile(tempDir);	
			}
			else	//若为目录,递归的删除目录
			{
				deleteDir(tempDir);
			}
		}
		dirCol[curDirPos].items.remove((Object)position);   //将当前目录从到当前目录的文件索引中删除
		dirCol[position].clear();	//FCB清零
	}
	
	//打开文件
	public void fileOpen(int pos)
	{
		int cur;
		openFlag = pos;
		cur = dirCol[pos].position;  //找到当前文件对应的第一块物理块
		fInput.setText(block[cur]);	//将第一块物理块的内容显示出来
		while(spaces[cur] != 100)	//若还有后续物理块,则继续追加内容显示
		{	
			cur = spaces[cur];
			fInput.append(block[cur]);
		}
	}
	
	//保存文件
	public void fileSave()
	{
		String content;
		content = fInput.getText();	//得到当前文件内容
		int cur;
		cur = dirCol[openFlag].position;
		while(content.length() > 1000)	//若文件长度超过1000,则将其分割至多个物理块存放
		{	
			if (cur != 100) //文件大小未超过预定义的块数
			{
				String temp = content.substring(0, 1000);	//0-1000的内容存当前物理块
				block[cur] = temp;
				cur = spaces[cur];
				content = content.substring(1000, content.length());	//保留余下的内容,继续储存
			}
			else
			{
				JOptionPane.showMessageDialog(null, "文件大小已超过预定义的块数,多余部分将无法保存");
				break;
			}		
		}
		//		还有最后一部分内容未保存(<=1000)
		if (cur != 100)	
		{
			block[cur] = content;
			JOptionPane.showMessageDialog(null, "文件已保存");
		}
		else
		{
			JOptionPane.showMessageDialog(null, "文件大小已超过预定义的块数,多余部分将无法保存");
		}
		
	}
	
	//关闭当前文件
	public void fileClose()
	{
		fInput.setText("");
		openFlag = 0;
		JOptionPane.showMessageDialog(null, "文件已关闭");
		fInput.setEditable(false);	//禁用文本区
	}
	
	//	输出内存中内容至磁盘
	public void sysSave(String name)
	{
		try
		{
			ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(name));
			
			out.writeObject(dirCol);
			out.writeObject(spaces);
			out.writeObject(block);
			
			out.close();
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	//将磁盘中的内容读入内存	
	public void sysOpen(String name)
	{
		try
		{
			ObjectInputStream in = new ObjectInputStream(new FileInputStream(name));
			
			dirCol = (DirStr[]) in.readObject();
			spaces = (int[]) in.readObject();
			block = (String[]) in.readObject();
			
			curDirName = dirCol[0].name;
			directory.setText(curDirName);
			curDirPos = 0;
			tableRefresh(0);
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
	}
	
	//判断当前文件夹下面是否有与新建的文件相同名称且相同类型的文件
	public boolean ifSameName(String name,String type)
	{
		Integer tempDir;
		for(int i=0;i<dirCol[curDirPos].items.size();i++)
		{
			tempDir = (Integer) dirCol[curDirPos].items.elementAt(i);
			if(dirCol[tempDir].name.equals(name) && dirCol[tempDir].flag.equals(type))
				return true;
		}
		return false;
	}	
}	


class DirStr implements Serializable{
	public Vector items = new Vector();   //存放当前目录下的子目录和文件的FCB编号 仅限目录使用
	String flag;     //表示该FCB代表的类型,file为文件,dir为目录
	String name;  	//该FCB代表的文件(文件夹)的名字
	int position=-1;  //该文件对应的首个物理块的地址 仅限文件使用
	int size=0;     //该文件的大小,若为目录则为0
	int upDir=-1;       //该文件(目录)的上一层目录对应的FCB号
	public void clear()	//某个FCB清零还原
	{
		items.clear();
		flag = "";
		name = "";
		position = -1;
		size = 0;
		upDir = -1;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -