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

📄 filemanager.java

📁 用JAVA模拟操作系统的文件管理
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
import java.util.*;
//import javax.swing.*;

/*
 * Created on 2004-6-29
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author 刘俊晖
 *
 * 文件系统的内核
 */
public class FileManager {

	public static void main(String[] args) {
		//-----for test-----//

		//FileManager fileManager = new FileManager();
		//fileManager.testCreate();
		//fileManager.testChangeDir();
		//fileManager.testModify();
		//fileManager.testDelete();
	}

	//////////////////////////////////////
	//根目录区二维空间(默认大小占1个扇区) 
	char[][] rootTable;

	//fat表,用于索引数据区   
	char[] fatTable;

	//数据区,用于存放文本文件或者是目录信息
	char[][] dataArea;

	//记录当前目录信息的栈
	ArrayList directoryStack;

	//记录当前的路径
	ArrayList path;

	//////////////////////////////////////
	private void test() {
	}

	//构造函数,初始化一些信息
	public FileManager() {
		System.out.println("Create filemanager!");
		rootTable = new char[Utility.NUM_OF_ROOTFILE][Utility.SIZE_OF_FILEINFO];
		fatTable = new char[Utility.NUM_OF_DATASECTOR];
		dataArea = new char[Utility.NUM_OF_DATASECTOR][Utility.SIZE_OF_SECTOR];

		this.formatAll();

	}

	/**
	 * 配置文件存储环境
	 */
	private boolean deploy() {

		return true;
	}

	/**
	 * 格式化和清除信息
	 */
	//格式化所有信息(主要针对根目录表和Fat表)
	void formatAll() {
		//将文件信息的状态项表示为可用(其他信息在再次使用的时候清除)
		for (int i = 0; i < Utility.NUM_OF_ROOTFILE; i++) {
			rootTable[i][Utility.POS_STATE] = Utility.FREE;
			rootTable[i][Utility.POS_FAT] = Utility.FREE_FOR_FAT;
		}

		//清空Fat表(没有必要此时清除数据区的内容,Fat表的信息可控制数据区的信息)
		for (int i = 0; i < Utility.NUM_OF_DATASECTOR; i++) {
			fatTable[i] = Utility.FREE_FOR_FAT;
		}

		//新建目录栈
		directoryStack = new ArrayList();
		directoryStack.add(new Integer(-1)); //初始为根目录
		path = new ArrayList();
		path.add("MyRoot:");
		//System.out.println("stack = " + directoryStack.size());
	}

	//格式化相应的数据区的扇区内容(用于存放数据)
	void formatSectorForData(int freeIndex) {
		for (int i = 0; i < Utility.SIZE_OF_SECTOR; i++) {
			dataArea[freeIndex][i] = 0;
		}
	}

	//格式化相应的数据区的扇区内容(用于存放目录信息)
	void formatSectorForDir(int freeIndex) {
		char[] sector = dataArea[freeIndex];
		for (int i = 0; i < Utility.NUM_OF_SUBFILE; i++) {
			sector[i * Utility.SIZE_OF_FILEINFO + Utility.POS_STATE] =
				Utility.FREE;
			sector[i * Utility.SIZE_OF_FILEINFO + Utility.POS_FAT] =
				Utility.FREE_FOR_FAT;
		}
	}

	/**
	 * 新建目录或文件信息项
	 */
	boolean createInfo(char type, String name) {
		if (name.length() > 12) {
			return false;
		}
		int currentDirectory =
			((Integer) directoryStack.get(directoryStack.size() - 1))
				.intValue();
		int fatIndex;

		if (this.inDirectory(type, name, false) != -1) {
			System.out.println(
				"collide fatIndex:" + inDirectory(type, name, false));
			return false;
		}

		//在根目录建
		if (currentDirectory == -1) {
			for (int i = 0; i < Utility.NUM_OF_ROOTFILE; i++) {
				if (rootTable[i][Utility.POS_STATE] == Utility.FREE) {
					if ((fatIndex = getFreeSector(type)) != -1) {
						rootTable[i][Utility.POS_FAT] = (char) fatIndex;
						//format
						rootTable[i][Utility.POS_STATE] = type;
						this.changeNameOfFileInfo(
							rootTable[i],
							Utility.POS_NAME,
							name);
						return true;
					}
					return false;
				}
			}
			return false;
		}
		//在子目录建
		char[] subDirectory = dataArea[currentDirectory];

		for (int i = 0; i < Utility.NUM_OF_SUBFILE; i++) {
			if (subDirectory[i * Utility.SIZE_OF_FILEINFO + Utility.POS_STATE]
				== Utility.FREE) {
				if ((fatIndex = getFreeSector(type)) != -1) {
					subDirectory[i * Utility.SIZE_OF_FILEINFO
						+ Utility.POS_FAT] =
						(char) fatIndex;
					subDirectory[i * Utility.SIZE_OF_FILEINFO
						+ Utility.POS_STATE] =
						type;
					this.changeNameOfFileInfo(
						subDirectory,
						i * Utility.SIZE_OF_FILEINFO,
						name);
					return true;
				}
				return false;
			}
		}
		return false;
	}

	private void testCreate() {
		System.out.println("------testCreate--------");
		this.createInfo(Utility.FILE, "file1");
		//this.createInfo(Utility.FILE, "file2");
		//this.createInfo(Utility.FILE, "file3");
		//this.showCurrentDirInfo();
		this.createInfo(Utility.DIRECTORY, "dir1");
		//this.createInfo(Utility.DIRECTORY, "dir2");
		//this.showCurrentDirInfo();
	}

	//在Fat表找空闲扇区,找不到返回-1
	int getFreeSector(char type) {
		for (int i = 0; i < Utility.NUM_OF_DATASECTOR; i++) {
			if (fatTable[i] == Utility.FREE_FOR_FAT) {
				if (type == Utility.FILE) {
					this.formatSectorForData(i);
				} else if (type == Utility.DIRECTORY) {
					this.formatSectorForDir(i);
				}
				fatTable[i] = Utility.END_OF_FILE;
				return i;
			}
		}
		return -1;
	}

	//修改根目录文件信息中的名字信息
	void changeNameOfFileInfo(char[] fileInfo, int index, String name) {
		for (int i = 0; i < Utility.LEN_OF_NAME; i++) {
			fileInfo[index + i] = 0;
		}
		for (int i = 0; i < name.length(); i++) {
			fileInfo[index + i] = name.charAt(i);
		}
	}

	/**
	 * 修改文件所需的扇区
	 */
	public boolean loadFile(String name, StringBuffer content) {
		int fatIndex = inDirectory(Utility.FILE, name, false);
		if (fatIndex == -1) {
			return false;
		}

		int nextIndex = fatTable[fatIndex];
		while (true) {
			content.append(
				String
					.valueOf(dataArea[fatIndex], 0, Utility.SIZE_OF_SECTOR)
					.trim());
			System.out.println("file content : " + content.toString());
			if (nextIndex == Utility.END_OF_FILE) {
				return true;
			}
			fatIndex = nextIndex;
			nextIndex = fatTable[fatIndex];
		}
	}

	public boolean writeFile(String name, String content) {
		int fatIndex = inDirectory(Utility.FILE, name, false);
		if (fatIndex == -1) {
			return false;
		}
		if (content.length() == 0) {
			return true;
		}

		int objectTotal =
			content.length() % Utility.SIZE_OF_SECTOR == 0
				? content.length() / Utility.SIZE_OF_SECTOR
				: content.length() / Utility.SIZE_OF_SECTOR + 1;

		if (this.modifySector(name, objectTotal) == false) {
			return false;
		}

		int bufferIndex = 0;
		int bufferLeft = content.length();

		for (int i = 0; i < objectTotal; i++) {
			if (i == objectTotal - 1) {
				for (int j = 0; j < bufferLeft; j++) {
					char a = content.charAt(bufferIndex++);
					this.dataArea[fatIndex][j] = a;
				}
			} else {
				for (int k = 0; k < Utility.SIZE_OF_SECTOR; k++) {
					this.dataArea[fatIndex][k] = content.charAt(bufferIndex++);
				}
			}
			bufferLeft = bufferLeft - Utility.SIZE_OF_SECTOR;
			fatIndex = fatTable[fatIndex];
		}
		return true;
	}

	//根据目标大小修改文件的扇区
	boolean modifySector(String name, int objectTotal) {
		int fatIndex = this.inDirectory(Utility.FILE, name, false);
		if (fatIndex == -1) {
			return false;
		}
		showFatList(fatIndex);

		int initIndex = fatIndex;
		int[] fatArray = new int[Utility.MAX_SECTOR];
		int arrayIndex = -1;

		fatArray[++arrayIndex] = fatIndex;
		while (true) {
			if (fatTable[fatIndex] != Utility.END_OF_FILE) {
				fatArray[++arrayIndex] = fatTable[fatIndex];
				fatIndex = fatArray[arrayIndex];
			} else
				break;
		}
		int orientTotal = arrayIndex + 1;
		/*System.out.println(
			"orient total : "
				+ orientTotal
				+ "   object total : "
				+ objectTotal);*/
		int diff = Math.abs(objectTotal - orientTotal);
		if (objectTotal > orientTotal) {
			int freeIndex;
			for (int i = 0; i < diff; i++) {
				freeIndex = getFreeSector(Utility.FILE);
				if (freeIndex == -1) {
					return false;
				}
				fatArray[++arrayIndex] = freeIndex;
			}
			//保证了空间足够
			arrayIndex = orientTotal - 1;
			for (int i = 0; i < diff; i++) {
				fatTable[fatArray[arrayIndex]] =
					(char) fatArray[arrayIndex + 1];
				arrayIndex++;
			}
			fatTable[fatArray[arrayIndex]] = Utility.END_OF_FILE;
			showFatList(initIndex);
		}
		if (objectTotal < orientTotal) {
			arrayIndex = objectTotal - 1;
			fatTable[arrayIndex] = Utility.END_OF_FILE;
			for (int i = 1; i <= diff; i++) {
				fatTable[fatArray[arrayIndex + i]] = Utility.FREE_FOR_FAT;
			}
			showFatList(initIndex);
		}
		return true;
	}

	private void showFatList(int fatIndex) {
		System.out.print("Fat List : " + fatIndex);
		while (fatTable[fatIndex] != Utility.END_OF_FILE) {
			fatIndex = fatTable[fatIndex];
			System.out.print(" " + fatIndex);
		}
		System.out.println(" " + fatTable[fatIndex]);
	}

	private void testModify() {
		System.out.println("------testModify--------");
		this.showCurrentDirInfo();
		this.createInfo(Utility.FILE, "file1");
		this.createInfo(Utility.DIRECTORY, "dir1");
		this.showCurrentDirInfo();
		this.changeDirectory("dir1");
		this.createInfo(Utility.FILE, "dir1");
		this.showCurrentDirInfo();
		modifySector("dir1", 3);
		this.showCurrentDirInfo();
	}

	/**
	 * 删除目录或文件信息项

⌨️ 快捷键说明

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