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

📄 myfilesystem.java

📁 NAS文件器的模拟
💻 JAVA
字号:
package fileSystem;

import java.io.*;

public class MyFileSystem {

	private SuperBlock superBlock;
	
	public MyFileSystem() {
		superBlock = new SuperBlock("SuperBlock.dat");
	}
	
	public int getINodeNumber(Path path) {
		INodeNumber iNodeNumber = new INodeNumber(superBlock.getINodeRoot().getINodeNumber());
		do{
			int block = VirtualData.getBlockInINode(iNodeNumber.getINodeNumber());
			iNodeNumber.setINodeNumber(VirtualData.getINodeInCat(block, path.getName()));
			path = path.getTail();
		}while (path != null);
		return iNodeNumber.getINodeNumber();
	}
	
	public DataBlock getDataBlock (Path path) {
		int iNode = getINodeNumber(path);
		try {
			if (VirtualData.isDir(iNode)) {
				int data = VirtualData.getBlockInINode(iNode);
				return new DataBlock(data);
			}
			else {
				DataBlock db = new DataBlock(VirtualData.getBlockInINode(iNode));
				return db;
			}
		}catch (Exception e) {
			return null;
		}
	}
	
	public int dirCreat (String dirName, Path path) {
		int getNextINode = VirtualData.getNextINode("iNodeBitMap");
		if (getNextINode == -1) {
			//I节点用完。
			return 0;
		}
		int getNextBlock = VirtualData.getNextBlock("fileBitMap");
		if (getNextBlock == -1) {
			//磁盘块用完
			return 1;
		}
		DataBlock db = getDataBlock(path);
		if (VirtualData.getINodeInCat(db.getDataLoc(), dirName) != -1){
			//已经有相同名字的目录。
			return 2;
		}
		VirtualData.setINodeBlock(getNextINode, getNextBlock, "iNodeBitMap", "fileBitMap", 1);
		VirtualData.addAnItem(db.getDataLoc(), dirName, getNextINode);
		VirtualData.creatDirINode(getNextINode, dirName, getNextBlock);
		VirtualData.creatDat("DataBlock" + String.valueOf(getNextBlock));
		VirtualData.addAnItem(getNextBlock, ".", getNextINode);
		VirtualData.addAnItem(getNextBlock, "..", getINodeNumber(path));
		//成功
		return 3;
	}
	
	public CatalogueItem dirOpen (Path path){
		DataBlock db = getDataBlock(path);
		if (db == null) {
			return null;
		}
		CatalogueItem ci = null;
		try {			
			RandomAccessFile in = new RandomAccessFile("DataBlock" + 
					String.valueOf(db.getDataLoc()) + ".dat", "r");
			for (String i = in.readUTF(); i != null;i = in.readUTF()){
				if (ci == null) {
					ci = new CatalogueItem(in.readInt(), i);
				}
				else {
					ci.addCatalogueItem(in.readInt(), i);
				}
			}
			in.close();
			return ci;
		}catch(EOFException eofe){
			int iNode = getINodeNumber(path);
			VirtualData.setNewAccessTime(iNode);
			return ci;
		}catch (Exception e){
			return null;
		}	
	}
	
	public boolean dirDelete(Path path) {
		DataBlock db = getDataBlock(path);
		int id = getINodeNumber(path);
		if (VirtualData.countOfItem(db.getDataLoc()) != 2) {
			return false;
		}
		else {
			String dirName = path.getLastName();
			DataBlock fatherBlock = getDataBlock(path.upperPath());
			VirtualData.removeAnItem(fatherBlock.getDataLoc(), dirName);
			VirtualData.deleteDat("INode" + String.valueOf(id));
			VirtualData.deleteDat("DataBlock" + String.valueOf(db.getDataLoc()));
			VirtualData.setINodeBlock(id, db.getDataLoc(), "iNodeBitMap", "fileBitMap", 0);
			return true;
		}
	}
	
	public int fileCreat(String fileName, Path path, int uid, int gid) {
		int getNextINode = VirtualData.getNextINode("iNodeBitMap");
		if (getNextINode == -1) {
			/*I节点用完*/
			return 0;
		}
		int getNextBlock = VirtualData.getNextBlock("fileBitMap");
		if (getNextBlock == -1) {
			/*磁盘块用完*/
			return 1;
		}
		DataBlock db = getDataBlock(path);
		if (VirtualData.getINodeInCat(db.getDataLoc(), fileName) != -1){
			/*已经有相同名字的目录*/
			return 2;
		}
		VirtualData.setINodeBlock(getNextINode, getNextBlock, "iNodeBitMap", "fileBitMap", 1);
		VirtualData.addAnItem(db.getDataLoc(), fileName, getNextINode);
		VirtualData.creatFileINode(getNextINode, fileName, getNextBlock, uid, gid);
		VirtualData.creatDat("DataBlock" + String.valueOf(getNextBlock));
		/*成功*/
		return 3;
	}
	
	public FileINode fileOpen (Path path){
		int iNodeNumber = getINodeNumber(path);
		VirtualData.setNewAccessTime(iNodeNumber);
		FileINode fileINode = new FileINode(iNodeNumber);
		return fileINode;
	}
	
	public boolean fileWrite(int size, Path path) {
		int iNodeNumber = getINodeNumber(path);
		VirtualData.setNewSize(iNodeNumber, size);
		VirtualData.setNewAmendTime(iNodeNumber);
		return true;
	}
	
	public int fileRename(String oldName, String newName,Path path) {
		DataBlock db = getDataBlock(path);
		int iNodeNumber = VirtualData.getINodeInCat(db.getDataLoc(), newName);
		if (iNodeNumber != -1){
			/*已经有相同的名字在目录中*/
			return 0;
		}
		iNodeNumber = VirtualData.getINodeInCat(db.getDataLoc(), oldName);
		
		VirtualData.removeAnItem(db.getDataLoc(), oldName);
		VirtualData.addAnItem(db.getDataLoc(), newName, iNodeNumber);
		VirtualData.setNewName(iNodeNumber, newName);
		return 2;
	}
	
	public boolean fileDelete(Path path) {
		String fileName = path.getLastName();
		int iNodeNumber = getINodeNumber(path);
		DataBlock db = getDataBlock(path);		
		DataBlock fatherDb = getDataBlock(path.upperPath());
		VirtualData.removeAnItem(fatherDb.getDataLoc(), fileName);
		VirtualData.deleteDat("INode" + String.valueOf(iNodeNumber));
		VirtualData.deleteDat("DataBlock" + String.valueOf(db.getDataLoc()));
		VirtualData.setINodeBlock(iNodeNumber, db.getDataLoc(), "iNodeBitMap", "fileBitMap", 0);
		return true;
	}
}

⌨️ 快捷键说明

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