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

📄 filemanager.java

📁 用JAVA模拟操作系统的文件管理
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
	 */
	//删除当前目录下的文件或子目录
	boolean deleteInfo(char type, String name) {
		if (type == Utility.FILE) {
			int fatIndex = this.inDirectory(Utility.FILE, name, true);
			if (fatIndex != -1) {
				deleteSectorList(fatIndex);
				return true;
			}
		} else if (type == Utility.DIRECTORY) {
			int fatIndex = this.inDirectory(Utility.DIRECTORY, name, true);
			if (fatIndex != -1) {
				deleteSubDir(fatIndex);
				return true;
			}
		}
		return false;
	}

	private void deleteSubDir(int fatIndex) {
		deleteSectorList(fatIndex);
		char[] subDirectory = dataArea[fatIndex];
		for (int i = 0; i < Utility.NUM_OF_SUBFILE; i++) {
			int initPos = i * Utility.SIZE_OF_FILEINFO;
			if (subDirectory[initPos + Utility.POS_STATE] != Utility.FREE) {
				if (subDirectory[initPos + Utility.POS_STATE]
					== Utility.FILE) {
					deleteSectorList(subDirectory[initPos + Utility.POS_FAT]);
				} else if (
					subDirectory[initPos + Utility.POS_STATE]
						== Utility.DIRECTORY) {
					deleteSubDir(subDirectory[initPos + Utility.POS_FAT]);
				}
				subDirectory[initPos + Utility.POS_STATE] = Utility.FREE;
			}
		}
	}

	//在Fat表中清除某个文件信息的扇区链
	void deleteSectorList(int firstIndex) {
		if (firstIndex < 0 || firstIndex > Utility.NUM_OF_DATASECTOR) {
			return;
		}

		int nextIndex = fatTable[firstIndex];
		while (true) {
			//	System.out.println(
			//		"allocFreeSector " + firstIndex + "  " + (int) nextIndex);
			fatTable[firstIndex] = Utility.FREE_FOR_FAT;
			if (nextIndex == Utility.END_OF_FILE) {
				return;
			}
			firstIndex = nextIndex;
			nextIndex = fatTable[firstIndex];
		}
	}

	private void testDelete() {
		System.out.println("------testDelete--------");
		this.showCurrentDirInfo();

		changeDirectory("dir1");
		this.showCurrentDirInfo();

		changeDirectory("dir2");
		this.showCurrentDirInfo();

		changeDirectory("dir3");
		this.showCurrentDirInfo();

		//////delete subdir
		changeDirectory("\\");
		this.showCurrentDirInfo();

		deleteInfo(Utility.FILE, "file1");
		this.showCurrentDirInfo();

		deleteInfo(Utility.DIRECTORY, "dir1");
		this.showCurrentDirInfo();

		//////recreate
		this.createInfo(Utility.FILE, "file6");
		this.createInfo(Utility.DIRECTORY, "dir6");
		this.showCurrentDirInfo();

		changeDirectory("dir6");
		this.createInfo(Utility.FILE, "file7");
		this.showCurrentDirInfo();
		//this.modifySector("file7",3);
		this.createInfo(Utility.DIRECTORY, "dir7");
		this.showCurrentDirInfo();

		this.changeDirectory("\\");
		this.deleteInfo(Utility.FILE, "file6");
		changeDirectory("dir6");
		changeDirectory("dir7");
		this.showCurrentDirInfo();

		this.createInfo(Utility.FILE, "file8");
		this.createInfo(Utility.DIRECTORY, "dir8");
		this.showCurrentDirInfo();

	}

	/**
	 * 改变当前目录
	 */
	boolean changeDirectory(String name) {
		if (name.length() > 12) {
			return false;
		}

		//本目录
		if (name.compareTo(".") == 0) {
			return true;
		}

		//返回上一级目录
		if (name.compareTo("..") == 0) {
			if (directoryStack.size() <= 1) {
				return true;
			}
			path.remove(path.size() - 1);
			directoryStack.remove(directoryStack.size() - 1);
			return true;
		}

		//返回根目录
		if (name.compareTo("\\") == 0) {
			int deleteSize = directoryStack.size() - 1;
			for (int i = 1; i <= deleteSize; i++) {
				path.remove(1);
				directoryStack.remove(1);
			}
			return true;
		}

		//进入一个新的目录
		int fatIndex = inDirectory(Utility.DIRECTORY, name, false);
		if (fatIndex != -1) {
			path.add(name);
			directoryStack.add(new Integer(fatIndex));
			return true;
		}
		return false;
	}

	private void testChangeDir() {
		System.out.println("------testChangeDir--------");
		//this.showCurrentDirInfo();

		if (!changeDirectory("dir1"))
			System.out.println("can't change");
		//this.showCurrentDirInfo();

		this.createInfo(Utility.FILE, "file2");
		this.createInfo(Utility.DIRECTORY, "dir2");
		//this.showCurrentDirInfo();
		if (!changeDirectory("dir2"))
			System.out.println("can't change");
		//this.showCurrentDirInfo();

		this.createInfo(Utility.FILE, "file3");
		this.createInfo(Utility.DIRECTORY, "dir3");
		//this.showCurrentDirInfo();
		if (!changeDirectory("dir3"))
			System.out.println("can't change");
		//this.showCurrentDirInfo();

		if (!changeDirectory("\\"))
			System.out.println("can't change");
		//this.showCurrentDirInfo();
	}

	/**
	 * 目录信息读取和判断
	 */
	//判断文件和子目录的名字是否在当前目录中
	int inDirectory(char type, String name, boolean delete) {
		String tempName;
		//根目录下
		if (((Integer) directoryStack.get(directoryStack.size() - 1))
			.intValue()
			== -1) {
			if (type == Utility.FILE) {
				for (int i = 0; i < Utility.NUM_OF_ROOTFILE; i++) {
					if (rootTable[i][Utility.POS_STATE] == Utility.FILE) {
						tempName =
							new String(
								rootTable[i],
								Utility.POS_NAME,
								Utility.LEN_OF_NAME)
								.trim();
						if (tempName.compareTo(name) == 0) {
							if (delete == true) {
								rootTable[i][Utility.POS_STATE] = Utility.FREE;
							}
							return rootTable[i][Utility.POS_FAT];
						}
					}
				}
			} else if (type == Utility.DIRECTORY) {
				for (int i = 0; i < Utility.NUM_OF_ROOTFILE; i++) {
					if (rootTable[i][Utility.POS_STATE] == Utility.DIRECTORY) {
						tempName =
							new String(
								rootTable[i],
								Utility.POS_NAME,
								Utility.LEN_OF_NAME)
								.trim();
						if (tempName.compareTo(name) == 0) {
							if (delete == true) {
								rootTable[i][Utility.POS_STATE] = Utility.FREE;
							}
							return rootTable[i][Utility.POS_FAT];
						}
					}
				}
			}
			return -1;
		}

		//普通子目录下
		int fatIndex =
			((Integer) directoryStack.get(directoryStack.size() - 1))
				.intValue();
		char[] subDirectory = dataArea[fatIndex];

		if (type == Utility.FILE) {
			for (int i = 0; i < Utility.NUM_OF_SUBFILE; i++) {
				if (subDirectory[i * Utility.SIZE_OF_FILEINFO
					+ Utility.POS_STATE]
					== Utility.FILE) {
					tempName =
						new String(
							subDirectory,
							i * Utility.SIZE_OF_FILEINFO + Utility.POS_NAME,
							Utility.LEN_OF_NAME)
							.trim();
					if (tempName.compareTo(name) == 0) {
						if (delete == true) {
							subDirectory[i * Utility.SIZE_OF_FILEINFO
								+ Utility.POS_STATE] =
								Utility.FREE;
						}
						return subDirectory[i * Utility.SIZE_OF_FILEINFO
							+ Utility.POS_FAT];
					}
				}
			}
		} else if (type == Utility.DIRECTORY) {
			for (int i = 0; i < Utility.NUM_OF_SUBFILE; i++) {
				if (subDirectory[i * Utility.SIZE_OF_FILEINFO
					+ Utility.POS_STATE]
					== Utility.DIRECTORY) {
					tempName =
						new String(
							subDirectory,
							i * Utility.SIZE_OF_FILEINFO + Utility.POS_NAME,
							Utility.LEN_OF_NAME)
							.trim();
					if (tempName.compareTo(name) == 0) {
						if (delete == true) {
							subDirectory[i * Utility.SIZE_OF_FILEINFO
								+ Utility.POS_STATE] =
								Utility.FREE;
						}
						return subDirectory[i * Utility.SIZE_OF_FILEINFO
							+ Utility.POS_FAT];
					}
				}
			}
		}
		return -1;
	}

	//得到当前目录的信息
	ArrayList getCurrentDirInfo() {
		ArrayList infoList = new ArrayList();
		int currentDirectory =
			((Integer) directoryStack.get(directoryStack.size() - 1))
				.intValue();
		System.out.println("currentDirectory : " + currentDirectory);
		if (currentDirectory == -1) {
			for (int i = 0; i < Utility.NUM_OF_ROOTFILE; i++) {
				if (rootTable[i][Utility.POS_STATE] != Utility.FREE) {
					infoList.add(new String(rootTable[i]));
				}
			}
			return infoList;
		}

		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) {
				String addStr =
					new String(
						subDirectory,
						i * Utility.SIZE_OF_FILEINFO,
						Utility.SIZE_OF_FILEINFO);
				infoList.add(addStr);
			}
		}
		return infoList;
	}

	//显示当前目录信息
	private void showCurrentDirInfo() {
		ArrayList infoList = this.getCurrentDirInfo();
		String name;
		char state, fatIndex, size, readonly;
		for (int i = 0; i < infoList.size(); i++) {
			String temp = (String) infoList.get(i);
			name = temp.substring(0, 12);
			state = temp.charAt(12);
			fatIndex = temp.charAt(13);
			size = temp.charAt(14);
			readonly = temp.charAt(15);
			System.out.println(
				"Name : "
					+ name.trim()
					+ "  State:"
					+ (int) state
					+ "  Fat:"
					+ (int) fatIndex
					+ "  Size:"
					+ (int) size
					+ "  ReadOnly:"
					+ (int) readonly);
		}
		if (infoList.size() == 0) {
			System.out.println("Empty!!");
		}
		return;
	}

	public String getCurrentPath() {
		String pathStr = "", temp;
		for (int i = 0; i < path.size(); i++) {
			temp = (String) path.get(i);
			pathStr = pathStr + temp + "\\";
		}
		pathStr = pathStr + ">";
		System.out.println(pathStr);
		return pathStr;
	}
}

⌨️ 快捷键说明

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