📄 filemanager.java
字号:
*/
//删除当前目录下的文件或子目录
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 + -