📄 myfilesystem.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 + -