From 022922f8ad7ddca2b0304156fb890b4c9919ae58 Mon Sep 17 00:00:00 2001 From: blastho <2904411786@qq.com> Date: Wed, 22 Nov 2023 11:31:52 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E5=AE=9E=E7=8E=B0FAT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Disk.sfs | Bin 1152 -> 994 bytes DiskBlock.sfs | Bin 0 -> 2125 bytes main/resources/Main-view.fxml | 2 +- main/src/Data/DiskBlock.java | 123 ++++++++++++++++++ main/src/Data/FAT.java | 151 +++++++++++++++++++--- main/src/Data/File.java | 93 +++++++++++-- main/src/Data/StoreDiskBlock.java | 33 +++++ main/src/Data/StoreFileToDiskBlock.java | 68 ++++++++++ main/src/Main/Main.java | 23 ++++ main/src/controller/FileController.java | 8 +- main/src/controller/MainController.java | 73 ++++++++--- main/src/controller/RenameController.java | 2 + main/src/operations/deleteOperations.java | 5 +- main/src/util/FileRW.java | 14 +- main/src/util/UpdateAbsolutePath.java | 22 ++++ 15 files changed, 565 insertions(+), 52 deletions(-) create mode 100644 DiskBlock.sfs create mode 100644 main/src/Data/StoreDiskBlock.java create mode 100644 main/src/Data/StoreFileToDiskBlock.java create mode 100644 main/src/util/UpdateAbsolutePath.java diff --git a/Disk.sfs b/Disk.sfs index 655c947a417a1d7617ff6678e662ccc80e04c2ce..22308ebcface2cab3387b04d5354df30c7bf8ea6 100644 GIT binary patch literal 994 zcma))PfO!K7{=e$HpW`Pf3PRNLW{7hP*36?h=kU)dT8-7CSyD8B#oIj+IkQc7W@W< zJ?w3ddk|q4)DPf&KfxYsZ+-`7W?M09Ar2%==6&AZ^SohxK0#K5FtbIF6m}S=Hw(YM zMt`5y(lBR1-esa)MG|5;^6FqRvD4u$4eO9+qTC5R!c|Wl3??c8_3MyhVxJPX;`5#s zReJ)dr$iPQocaxHT96U!g4&QL$D+d{q-Ek!ghjhW&Pb6Hzfr7W$o$5-)HqGX-H`eU zfiVA16CvY8n+cSPX{X~O_3;!gA!UPkB83V#`ZfY0yAfg5Rx=hAXT2MMT&Y(NAY?a7 zM@~upj3t$$pgam2VMuz)sQcy5%C`sdeF{>e{F-5&XC%ZF%1o`ahU%?+AuLPguzx+c zzZ>?i9`ApjtwpU?fU30c=3GHCFQ}=M$~RsJAO1rPe%x9?YFqBSbfv&>jr1fk5 zSRA*=CZu&f9;~*55igckSK=@u0k*f@+drQO)0H@EI(hid?WXI!cX%z1TbK!X4|b!& q+QhuN5{Jzsz}R+;UrdDQN*tC?fbAVy(cy$kq|Y^Kd4H`AX9O literal 1152 zcmcIiy>HV%6n{?AB$R+k!wM4rKq3)QL_1McK?ajRqYB~e6rY_7wsYLQ5QhPYiIu4m z0~;d)6B6_fU}t2e-5A-qcS)*Z30WO@^2xsYeY}tJ$6v6f6g1 zfYx25*qo}!UVp##?i+hw24`8g)z)Seqp4}iY{Mb5RoLUI*_AD=Ttss$&G}z6+vut` zi2w*!P7XgEAALPJeDm|@^ZhM7PN**&bo* zr<7*S-2c3sY(aQI)A(%F&9Wq@zQ(oS5lPgq# zdBRAW6@)s<&63TP`?Sa=e*syShy5bah6;G3!@y>y)Va*NPj2JQB9naP>8umR=M_ch Wb;I+D^yB{Sy@hD;la+?sQvLy4-boMu diff --git a/DiskBlock.sfs b/DiskBlock.sfs new file mode 100644 index 0000000000000000000000000000000000000000..c91c2a43082b9c96eb8ad747c179936e6df4afea GIT binary patch literal 2125 zcmZwC%TE(g6vy#nA4qxl07ON6fp3MPpa@k_s6w@(QbCl54mg(5b~;RNp`d_q`n|#js-E(r6x5S&VqK55_U-XNTKprFyk%!3&vXZPKkC4^mQSumhoU9>FkhSDV@)UWRJVTx(>&SZY z9C@C+Kwcy-k(bFU@#Ve%>2OFko?lP}0VGD5y2`^f?F6*)-0Cf|@llihQYSxr^y*IOU{yW - + diff --git a/main/src/Data/DiskBlock.java b/main/src/Data/DiskBlock.java index e7bdfa5..24ac95b 100644 --- a/main/src/Data/DiskBlock.java +++ b/main/src/Data/DiskBlock.java @@ -1,11 +1,123 @@ package Data; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import util.GetFileAbsolutePath; + +import java.io.IOException; +import java.io.ObjectInputStream; import java.io.Serializable; public class DiskBlock implements Serializable { private int number; //磁盘号 private int nextDiskNum; //用于记录文件的下一个磁盘块 (若为0,表示该磁盘块空闲,-1表示文件内容结束,254表示磁盘损坏,不能使用) private String type; //存储的类型(文件,文件夹,系统文件,空); + private File file; //指向文件或文件夹 + + public DiskBlock(int number, int nextDiskNum, String type, File file) { + this.number = number; + this.nextDiskNum = nextDiskNum; + this.type = type; + this.file = file; + + setNumberProperty(); + setNextDiskNumProperty(); + setTypeProperty(); + setFileProperty(); + } + + /* private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { + s.defaultReadObject(); + numberProperty = new SimpleStringProperty(String.valueOf(number)); + nextDiskNumProperty = new SimpleStringProperty(String.valueOf(nextDiskNum)); + typeProperty = new SimpleStringProperty(type); + fileProperty = new SimpleStringProperty(file == null ? "" : file.toString()); + setObject(file); + }*/ + + public transient StringProperty numberProperty = new SimpleStringProperty(); + public transient StringProperty nextDiskNumProperty = new SimpleStringProperty(); + public transient StringProperty typeProperty = new SimpleStringProperty(); + public transient StringProperty fileProperty = new SimpleStringProperty(); + + public String getNumberProperty() { + return numberProperty.get(); + } + + public StringProperty numberPropertyProperty() { + return numberProperty; + } + + public String getNextDiskNumProperty() { + return nextDiskNumProperty.get(); + } + + public StringProperty nextDiskNumPropertyProperty() { + return nextDiskNumProperty; + } + + public String getTypeProperty() { + return typeProperty.get(); + } + + public StringProperty typePropertyProperty() { + return typeProperty; + } + + public String getFileProperty() { + return fileProperty.get(); + } + + public StringProperty filePropertyProperty() { + return fileProperty; + } + + public void allowNextBlock(){ + setNextDiskNum(nextDiskNum); + setType(type); + setObject(file); + } + + public void clearBlock() { + setNextDiskNum(0); + setType(""); + setObject(null); + } + public void setObject(File file){ + this.file = file; + if (file != null){ + this.fileProperty.bind(file.absoluteNamePropertyProperty()); + } else { + this.fileProperty.unbind(); + setFileProperty(); + } + } + + private void setNumberProperty(){ + numberProperty.set(String.valueOf(number)); + } + private void setNextDiskNumProperty() { + nextDiskNumProperty.set(String.valueOf(nextDiskNum)); + } + private void setTypeProperty() { + this.typeProperty.set(type); + } + + public void setFileProperty(){ + if(file!=null) { + this.fileProperty.set(GetFileAbsolutePath.getAbsPath(file)); + }else { + this.fileProperty.set(""); + } + } + + public File getFile() { + return file; + } + + public void setFile(File file) { + this.file = file; + } public int getNumber() { return number; @@ -21,6 +133,7 @@ public class DiskBlock implements Serializable { public void setNextDiskNum(int nextDiskNum) { this.nextDiskNum = nextDiskNum; + this.setNextDiskNumProperty(); } public String getType() { @@ -29,5 +142,15 @@ public class DiskBlock implements Serializable { public void setType(String type) { this.type = type; + setTypeProperty(); + } + + private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { + s.defaultReadObject(); + numberProperty = new SimpleStringProperty(String.valueOf(number)); + nextDiskNumProperty = new SimpleStringProperty(String.valueOf(nextDiskNum)); + typeProperty = new SimpleStringProperty(type); + fileProperty = new SimpleStringProperty(file == null ? "" : file.getAbsoluteName()); + setObject(file); } } diff --git a/main/src/Data/FAT.java b/main/src/Data/FAT.java index 38c4460..1fc362b 100644 --- a/main/src/Data/FAT.java +++ b/main/src/Data/FAT.java @@ -1,18 +1,151 @@ package Data; +import java.io.Serializable; import java.util.List; -public class FAT { +public class FAT implements Serializable { private DiskBlock[] diskBlocks; //磁盘块 private File root; //根文件 - private Path rootPath; //根路径 - private List paths;//存储所有的path + + public FAT(){ + diskBlocks = new DiskBlock[128]; + diskBlocks[0] = new DiskBlock(0,-1,"系统文件",null); + diskBlocks[1] = new DiskBlock(1,-1,"系统文件",null); + for(int i = 2; i < 128; i++){ + diskBlocks[i] = new DiskBlock(i,0,null,null); + } + + } public DiskBlock[] getDiskBlocks() { return diskBlocks; } + //判断空间是否足够 + public boolean judge(File file){ + int sum = 0; + for(int i = 2; i < 128; i++){ + if(diskBlocks[i].getNextDiskNum() == 0){ + sum++; + } + } + int needNum = file.getNeed(); + if(needNum <= sum){ + return true; + }else { + return false; + } + } + public void applySpace(File file){ + if(!judge(file)){ + System.out.println("磁盘空间不足"); + return; + } + int neededDiskNum = file.getLength(); + int record = neededDiskNum ; + int previous = 0; + String fileType = ""; + if(file.isFolder){ + fileType = "文件夹"; + }else { + fileType = "文件文本"; + } + if(file.getDiskStartNum() == 0){ + for(int i = 0; i < 128; i++){ + if(record > 1) { + if (diskBlocks[i].getNextDiskNum() == 0) { + if(record != neededDiskNum){ + diskBlocks[previous].setNextDiskNum(i); + } + if(record == neededDiskNum){ + file.setDiskStartNum(i); + } + diskBlocks[i].setFile(file); + diskBlocks[i].setType(fileType); + diskBlocks[i].allowNextBlock(); + record--; + } + }else { + if(diskBlocks[i].getNextDiskNum() == 0){ + file.setDiskStartNum(i); + diskBlocks[i].setNextDiskNum(-1); + diskBlocks[i].setType(fileType); + diskBlocks[i].setFile(file); + diskBlocks[i].allowNextBlock(); + break; + } + } + } + }else { + int sum = 1; + previous = file.getDiskStartNum(); + while(diskBlocks[previous].getNextDiskNum() != -1){ + sum++; + previous = diskBlocks[previous].getNextDiskNum(); + } + if(sum == neededDiskNum){ + return; + } + if(sum < neededDiskNum){ + int need = neededDiskNum - sum; + int t = previous; + for(int i = 2; i < 128; i++){ + if(diskBlocks[i].getNextDiskNum() == 0){ + diskBlocks[t].setNextDiskNum(i); + t = i; + diskBlocks[i].setType(fileType); + diskBlocks[i].setFile(file); + diskBlocks[i].allowNextBlock(); + need--; + } + if(need == 0){ + diskBlocks[i].setNextDiskNum(-1); + diskBlocks[i].allowNextBlock(); + break; + } + } + } + if(sum > neededDiskNum){ + int t = 0,t2; + previous = file.getDiskStartNum(); + int t1 = previous; + while(diskBlocks[t1].getNextDiskNum() != -1){ + t++; + t2 = diskBlocks[t1].getNextDiskNum(); + if(t == neededDiskNum){ + diskBlocks[t1].setNextDiskNum(-1); + } + if(t > neededDiskNum){ + diskBlocks[t1].setNextDiskNum(0); + diskBlocks[t1].setFile(null); + diskBlocks[t1].setType(null); + diskBlocks[t1].clearBlock(); + } + t1 = t2; + } + diskBlocks[t1].setNextDiskNum(0); + diskBlocks[t1].setFile(null); + diskBlocks[t1].setType(null); + diskBlocks[t1].clearBlock(); + } + } + } + + public void reclaimSpace(File file){ + int startNum = file.getDiskStartNum(); + int t = startNum; + int record = t; + while(t != -1){ + diskBlocks[t].setFile(null); + diskBlocks[t].setType(null); + record = diskBlocks[t].getNextDiskNum(); + diskBlocks[t].setNumber(0); + diskBlocks[t].clearBlock(); + t = record; + } + } + public void setDiskBlocks(DiskBlock[] diskBlocks) { this.diskBlocks = diskBlocks; } @@ -25,19 +158,7 @@ public class FAT { this.root = root; } - public Path getRootPath() { - return rootPath; - } - public void setRootPath(Path rootPath) { - this.rootPath = rootPath; - } - public List getPaths() { - return paths; - } - public void setPaths(List paths) { - this.paths = paths; - } } diff --git a/main/src/Data/File.java b/main/src/Data/File.java index 1dc0cce..911a603 100644 --- a/main/src/Data/File.java +++ b/main/src/Data/File.java @@ -1,5 +1,12 @@ package Data; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.property.StringProperty; +import util.GetFileAbsolutePath; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.ArrayList; import java.util.List; @@ -16,7 +23,7 @@ public class File implements Serializable { private int length; //占用多少磁盘块 private boolean isOpen;//记录文件是否已被打开; private int size;//文件大小 - private Path path; + private String absoluteName; private String content;//文件内容; List childrenFile;//子文件或子目录 @@ -33,6 +40,12 @@ public class File implements Serializable { if(isFolder == true){ childrenFile = new ArrayList<>(); } + diskStartNum = 0; + absoluteName = GetFileAbsolutePath.getAbsPath(this); + length = 1; + setAbsoluteNameProperty(); + setDiskNumProperty(); + setLengthProperty(); } public boolean isReadOnly() { @@ -81,6 +94,7 @@ public class File implements Serializable { public void setDiskStartNum(int diskStartNum) { this.diskStartNum = diskStartNum; + setDiskNumProperty(); } public File getParent() { @@ -92,11 +106,17 @@ public class File implements Serializable { } public int getLength() { + getSize(); + length = content.length()/64; + if(content.length()%64 != 0){ + length += 1; + } return length; } public void setLength(int length) { this.length = length; + setLengthProperty(); } public boolean isOpen() { @@ -115,13 +135,6 @@ public class File implements Serializable { this.size = size; } - public Path getPath() { - return path; - } - - public void setPath(Path path) { - this.path = path; - } public String getContent() { return content; @@ -163,4 +176,68 @@ public class File implements Serializable { public boolean hasParent() { return parent != null; } + + public String getAbsoluteName() { + return absoluteName; + } + + public void setAbsoluteName(String absoluteName) { + this.absoluteName = absoluteName; + setAbsoluteNameProperty(); + } + + + + private transient StringProperty absoluteNameProperty = new SimpleStringProperty(); + private transient StringProperty diskNumProperty = new SimpleStringProperty(); + private transient StringProperty lengthProperty = new SimpleStringProperty(); + + + + public void readObject() { + absoluteNameProperty = new SimpleStringProperty(absoluteName); + diskNumProperty = new SimpleStringProperty(String.valueOf(diskStartNum)); + lengthProperty = new SimpleStringProperty(String.valueOf(length)); + } + + public String getAbsoluteNameProperty() { + return absoluteNameProperty.get(); + } + + public String getDiskNumProperty() { + return diskNumProperty.get(); + } + + public String getLengthProperty() { + return lengthProperty.get(); + } + public void setAbsoluteNameProperty() { + this.absoluteNameProperty.set(this.absoluteName); + } + + public void setDiskNumProperty() { + this.diskNumProperty.set(String.valueOf(diskStartNum)); + } + + public void setLengthProperty() { + this.lengthProperty.set(String.valueOf(length)); + } + + + + public StringProperty absoluteNamePropertyProperty() { + return absoluteNameProperty; + } + public StringProperty diskNumPropertyProperty() { + return diskNumProperty; + } + public StringProperty lengthPropertyProperty() { + return lengthProperty; + } + + public int getNeed(){ + return length - getLength(); + } + + } diff --git a/main/src/Data/StoreDiskBlock.java b/main/src/Data/StoreDiskBlock.java new file mode 100644 index 0000000..a2597ba --- /dev/null +++ b/main/src/Data/StoreDiskBlock.java @@ -0,0 +1,33 @@ +package Data; + +import java.io.Serializable; + +public class StoreDiskBlock implements Serializable { + private int number; //磁盘号 + private int nextDiskNum; //用于记录文件的下一个磁盘块 (若为0,表示该磁盘块空闲,-1表示文件内容结束,254表示磁盘损坏,不能使用) + private String type; //存储的类型(文件,文件夹,系统文件,空); + + public int getNumber() { + return number; + } + + public void setNumber(int number) { + this.number = number; + } + + public int getNextDiskNum() { + return nextDiskNum; + } + + public void setNextDiskNum(int nextDiskNum) { + this.nextDiskNum = nextDiskNum; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/main/src/Data/StoreFileToDiskBlock.java b/main/src/Data/StoreFileToDiskBlock.java new file mode 100644 index 0000000..e3e317e --- /dev/null +++ b/main/src/Data/StoreFileToDiskBlock.java @@ -0,0 +1,68 @@ +package Data; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +import static controller.MainController.fat; + + +public class StoreFileToDiskBlock implements Serializable { + + StoreDiskBlock[] storeDiskBlocks; + + + public StoreFileToDiskBlock() { + storeDiskBlocks = new StoreDiskBlock[128]; + for(int i = 0; i < 128; i++){ + storeDiskBlocks[i] = new StoreDiskBlock(); + } + } + + public StoreDiskBlock[] getStoreDiskBlocks() { + return storeDiskBlocks; + } + + public void setStoreDiskBlocks(StoreDiskBlock[] storeDiskBlocks) { + this.storeDiskBlocks = storeDiskBlocks; + } + + + + public void convert(File f,DiskBlock[] blocks){ + List childrenFile = f.getChildrenFile(); + int t ; + if(f.getParent() != null){ + t = f.getDiskStartNum(); + do{ + f.readObject(); + blocks[t].setType(storeDiskBlocks[t].getType()); + blocks[t].setNextDiskNum(storeDiskBlocks[t].getNextDiskNum()); + blocks[t].setObject(f); + /* blocks[t].setFileProperty();*/ + t = storeDiskBlocks[t].getNextDiskNum(); + }while (t != -1); + f.setAbsoluteNameProperty(); + f.setLengthProperty(); + f.setDiskNumProperty(); + } + if(childrenFile != null) { + for (File file1 : childrenFile) { + t = file1.getDiskStartNum(); + do{ + file1.readObject(); + blocks[t].setType(storeDiskBlocks[t].getType()); + blocks[t].setNextDiskNum(storeDiskBlocks[t].getNextDiskNum()); + blocks[t].setObject(file1); + /* blocks[t].setFileProperty();*/ + t = storeDiskBlocks[t].getNextDiskNum(); + }while (t != -1); + if(file1.isFolder){ + convert(file1,blocks); + } + } + } + } + +} + diff --git a/main/src/Main/Main.java b/main/src/Main/Main.java index 6c7f800..b707697 100644 --- a/main/src/Main/Main.java +++ b/main/src/Main/Main.java @@ -1,15 +1,23 @@ package Main; +import Data.DiskBlock; +import Data.StoreDiskBlock; +import Data.StoreFileToDiskBlock; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; +import java.io.File; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.ObjectOutputStream; import java.net.URL; import java.util.Vector; +import static controller.MainController.fat; + public class Main extends Application { static final int PATH_WIDTH = 1410; @@ -46,5 +54,20 @@ public class Main extends Application { } public static void main(String[] args) { launch(); + StoreFileToDiskBlock s = new StoreFileToDiskBlock(); + DiskBlock[] t = fat.getDiskBlocks(); + StoreDiskBlock[] d = s.getStoreDiskBlocks(); + for(int i = 0; i < 128; i++){ + d[i].setType(t[i].getType()); + d[i].setNumber(t[i].getNumber()); + d[i].setNextDiskNum(t[i].getNextDiskNum()); + } + try { + ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("DiskBlock.sfs"))); + oo.writeObject(d); + oo.close(); + } catch (IOException e) { + throw new RuntimeException(e); + } } } \ No newline at end of file diff --git a/main/src/controller/FileController.java b/main/src/controller/FileController.java index 61a9c30..c852779 100644 --- a/main/src/controller/FileController.java +++ b/main/src/controller/FileController.java @@ -10,8 +10,7 @@ import javafx.stage.Stage; import java.io.IOException; -import static controller.MainController.currentFile; -import static controller.MainController.rootFile; +import static controller.MainController.*; import static util.FileRW.writeDisk; public class FileController { @@ -42,13 +41,18 @@ public class FileController { saveItem.setDisable(true); } else { currentFile.setContent(contentField.getText()); + fat.applySpace(currentFile); + System.out.println(currentFile.getSize()); + System.out.println(currentFile.getLength()); if (currentFile.getParent() == rootFile) { currentFile = rootFile; } else { currentFile = currentFile.getParent(); } Stage stage = (Stage) contentField.getScene().getWindow(); + stage.close(); + writeDisk(); } } diff --git a/main/src/controller/MainController.java b/main/src/controller/MainController.java index fdbb7f8..9251970 100644 --- a/main/src/controller/MainController.java +++ b/main/src/controller/MainController.java @@ -1,27 +1,32 @@ package controller; +import Data.DiskBlock; +import Data.FAT; import Data.File; import Data.Path; -import com.sun.org.apache.xml.internal.resolver.CatalogEntry; + import javafx.animation.KeyFrame; import javafx.animation.Timeline; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.*; import javafx.scene.Scene; import javafx.scene.chart.PieChart; import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseButton; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.FlowPane; -import javafx.scene.text.Font; + import javafx.stage.Stage; import javafx.util.Duration; -import javafx.event.ActionEvent; + import javafx.event.EventHandler; import javafx.scene.input.MouseEvent; @@ -51,22 +56,22 @@ public class MainController { private Label data; @FXML - private TableColumn diskAddress; + private TableColumn diskAddress; @FXML private PieChart diskChart; @FXML - private TableColumn diskNext; + private TableColumn diskNext; @FXML - private TableColumn diskPath; + private TableColumn diskPath; @FXML - private TableColumn diskType; + private TableColumn diskType; @FXML - private TableView diskView; + private TableView diskView; @FXML private FlowPane fileExplorer; @@ -125,6 +130,11 @@ public class MainController { @FXML private ImageView upBtn; + // 右侧磁盘块 + private ObservableList data_Block; + + public static FAT fat; + // 创建文件 private MenuItem createFileItem; // 创建文件夹 @@ -146,9 +156,6 @@ public class MainController { public static Map> treeMap = new HashMap<>(); - Path rootPath; - Path currentPath; - public static Map icons = new HashMap<>(); Label selectIcon = null; @@ -159,12 +166,10 @@ public class MainController { void initialize() throws IOException, ClassNotFoundException { //项目初始化 timeInit(); - - rootPath = new Path("c:",null); - currentPath = rootPath; + fat = new FAT(); contextMenuInit(); menuItemAction(); -// rootFile = new File(false,true,false,true,"c:",null); + rootFile = new File(false,true,false,true,"c:",null); readDisk(); rootNode = new TreeItem("C:",new ImageView("icon/disk.png")); fileView.setRoot(rootNode); @@ -187,11 +192,36 @@ public class MainController { LabelMouseEventForFile(icons.get(file)); } } - // writeDisk(); + initTable(); + + writeDisk(); TreeViewIterator.tmpFileExplorer = fileExplorer; TreeViewIterator.tmpPathText = pathText; } + void initTable(){ + data_Block = FXCollections.observableArrayList(fat.getDiskBlocks()); + + diskAddress.setCellValueFactory(new PropertyValueFactory<>("numberProperty")); + diskAddress.setSortable(false); + diskAddress.setResizable(true); + + diskNext.setCellValueFactory(new PropertyValueFactory<>("nextDiskNumProperty")); + diskNext.setSortable(false); + diskNext.setResizable(true); + + diskType.setCellValueFactory(new PropertyValueFactory<>("typeProperty")); + diskType.setSortable(false); + diskType.setResizable(true); + + diskPath.setCellValueFactory(new PropertyValueFactory<>("fileProperty")); + diskPath.setSortable(false); + diskPath.setResizable(true); + + diskView.setItems(data_Block); + diskView.setEditable(false); + diskView.setEditable(false); + } private void contextMenuInit() { createFileItem = new MenuItem("新建文件"); createFolderItem = new MenuItem("新建文件夹"); @@ -288,6 +318,7 @@ public class MainController { } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } + fat.applySpace(file); }); createFolderItem.setOnAction(ActionEvent -> { @@ -301,6 +332,7 @@ public class MainController { } catch (IOException | ClassNotFoundException e) { throw new RuntimeException(e); } + fat.applySpace(folder); }); } @@ -350,7 +382,6 @@ public class MainController { currentFile = FindLabelToFile.findFile(icons, src); if(currentFile != null) { if (currentFile.isFolder()) { - System.out.println(1); System.out.println(src); openOperations.openFolder(fileExplorer, currentFile, icons); } else { @@ -370,7 +401,8 @@ public class MainController { if (currentFile != rootFile && currentFile.isFolder()) { openOperations.openFolder(fileExplorer, currentFile, icons); } - deleteOperations.deleteFile(fileExplorer, icons, deleteFile); + deleteOperations.deleteFile(fileExplorer, icons, deleteFile,fat); + try { writeDisk(); } catch (IOException | ClassNotFoundException e) { @@ -383,6 +415,7 @@ public class MainController { try { sentParam(fileView,pathText); renameFile(); + //UpdateAbsolutePath.updateChildrenPath(currentFile); } catch (Exception e) { throw new RuntimeException(e); } @@ -406,7 +439,6 @@ public class MainController { currentFile = FindLabelToFile.findFile(icons, src); if(currentFile != null) { if (currentFile.isFolder()) { - System.out.println(1); System.out.println(src); openOperations.openFolder(fileExplorer, currentFile, icons); String pathName = getAbsPath(currentFile); @@ -459,7 +491,6 @@ public class MainController { currentFile = FindLabelToFile.findFile(icons, src); if(currentFile != null) { if (currentFile.isFolder()) { - System.out.println(1); System.out.println(src); openOperations.openFolder(fileExplorer, currentFile, icons); recentNode = treeMap.get(currentFile); @@ -484,7 +515,7 @@ public class MainController { if (currentFile != rootFile && currentFile.isFolder()) { openOperations.openFolder(fileExplorer, currentFile, icons); } - deleteOperations.deleteFile(fileExplorer, icons, deleteFile); + deleteOperations.deleteFile(fileExplorer, icons, deleteFile,fat); TreeViewIterator treeViewIterator = new TreeViewIterator(); treeViewIterator.Clear(); treeViewIterator.iterator(fileView); diff --git a/main/src/controller/RenameController.java b/main/src/controller/RenameController.java index a6877c2..3a258ad 100644 --- a/main/src/controller/RenameController.java +++ b/main/src/controller/RenameController.java @@ -10,6 +10,7 @@ import javafx.scene.layout.AnchorPane; import javafx.scene.layout.Pane; import javafx.stage.Stage; import util.TreeViewIterator; +import util.UpdateAbsolutePath; import java.util.Map; @@ -49,6 +50,7 @@ public class RenameController { void renameConfirm(ActionEvent event) throws IOException, ClassNotFoundException { if (isAbleToRename(currentFile, renameField.getText())) { currentFile.setFileName(renameField.getText()); + UpdateAbsolutePath.updateChildrenPath(currentFile); icons.get(currentFile).setText(currentFile.getFileName()); if (currentFile.getParent() == rootFile) { currentFile = rootFile; diff --git a/main/src/operations/deleteOperations.java b/main/src/operations/deleteOperations.java index ebcd7a6..bec2ab5 100644 --- a/main/src/operations/deleteOperations.java +++ b/main/src/operations/deleteOperations.java @@ -1,5 +1,6 @@ package operations; +import Data.FAT; import Data.File; import javafx.scene.control.Label; import javafx.scene.layout.FlowPane; @@ -9,16 +10,18 @@ import java.util.ArrayList; import java.util.Map; public class deleteOperations { - public static void deleteFile(FlowPane fileExplorer, Map icons, File needToDelete) { + public static void deleteFile(FlowPane fileExplorer, Map icons, File needToDelete, FAT fat) { fileExplorer.getChildren().remove(icons.get(needToDelete)); if (needToDelete.isFolder()) { ArrayList deleteFiles = new ArrayList<>(); deleteFiles = new FileIterator().iterator(needToDelete); for (File file : deleteFiles) { icons.remove(file); + fat.reclaimSpace(file); } } icons.remove(needToDelete); needToDelete.getParent().getChildrenFile().remove(needToDelete); + fat.reclaimSpace(needToDelete); } } diff --git a/main/src/util/FileRW.java b/main/src/util/FileRW.java index 841e066..1c35071 100644 --- a/main/src/util/FileRW.java +++ b/main/src/util/FileRW.java @@ -1,23 +1,29 @@ package util; +import Data.StoreDiskBlock; +import Data.StoreFileToDiskBlock; + import java.io.*; -import static controller.MainController.icons; -import static controller.MainController.rootFile; +import static controller.MainController.*; public class FileRW { public static void readDisk() throws IOException, ClassNotFoundException { ObjectInputStream oi = new ObjectInputStream(new FileInputStream(new File("Disk.sfs"))); - rootFile = (Data.File) oi.readObject(); FileConvertToIcon fileConvertToIcon = new FileConvertToIcon(); fileConvertToIcon.convert(rootFile); + + oi = new ObjectInputStream(new FileInputStream(new File("DiskBlock.sfs"))); + StoreDiskBlock[] t = (StoreDiskBlock[])oi.readObject() ; + StoreFileToDiskBlock d = new StoreFileToDiskBlock(); + d.setStoreDiskBlocks(t); + d.convert(rootFile, fat.getDiskBlocks()); oi.close(); } public static void writeDisk() throws IOException, ClassNotFoundException { ObjectOutputStream oo = new ObjectOutputStream(new FileOutputStream(new File("Disk.sfs"))); - oo.writeObject(rootFile); oo.close(); } diff --git a/main/src/util/UpdateAbsolutePath.java b/main/src/util/UpdateAbsolutePath.java new file mode 100644 index 0000000..30f91e3 --- /dev/null +++ b/main/src/util/UpdateAbsolutePath.java @@ -0,0 +1,22 @@ +package util; + +import Data.File; + +import java.util.List; + +public class UpdateAbsolutePath { + public static void updateChildrenPath(File file){ + List Children = file.getChildrenFile(); + file.setAbsoluteName(GetFileAbsolutePath.getAbsPath(file)); + if(Children != null) { + for (File file1 : Children) { + if (file1.isFolder()) { + file1.setAbsoluteName(GetFileAbsolutePath.getAbsPath(file1)); + updateChildrenPath(file1); + } else { + file1.setAbsoluteName(GetFileAbsolutePath.getAbsPath(file1)); + } + } + } + } +} -- Gitee From 58d89d7fc3672189a49c9848c5b84124e3f4ef0a Mon Sep 17 00:00:00 2001 From: blastho <2904411786@qq.com> Date: Thu, 23 Nov 2023 18:23:24 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=AE=9E=E7=8E=B0diskChart=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/resources/Main-view.fxml | 6 +++--- main/src/Data/StoreFileToDiskBlock.java | 2 ++ main/src/controller/FileController.java | 13 +++++++++++-- main/src/controller/MainController.java | 17 +++++++++++++---- main/src/operations/openOperations.java | 1 + main/src/util/FileRW.java | 1 - 6 files changed, 30 insertions(+), 10 deletions(-) diff --git a/main/resources/Main-view.fxml b/main/resources/Main-view.fxml index a191c74..cfcad80 100644 --- a/main/resources/Main-view.fxml +++ b/main/resources/Main-view.fxml @@ -116,7 +116,7 @@ - + @@ -125,9 +125,9 @@