面向对象综合设计-简易文件资源管理器
目录
一、团队介绍
组员姓名 |
任务分配 |
| 黄凌钰(组长) | 按关键字检索文件、代码管理 |
| 廖山荣 | 对文件及磁盘的基本操作、博客编写 |
| 吴雨芃 | 筛选指定目录下的文件、目录树 |
二、本项目的git地址
https://gitee.com/pansol/file.git
三、项目git提交记录截图


四、项目功能架构图、主要功能流程图

五、前期调查
在网上查询许多别人的博客发现:大部分人都是模仿Windows的文件资源管理器对本机的文件目录树的显示,对文件目录进行查看和浏览,用地址栏、文件目录树、打开文件夹等方法都可以在文件目录之间进行跳转。
六、面向对象设计包图、类图

七、项目运行截图或屏幕录制
初始页面

按关键字搜索文件

对文件进行基本操作

复制黏贴

重命名


删除


属性查看

对磁盘基本操作


八、项目关键代码分模块描述
关键字模糊搜索功能
采用BFS算法,结合队列以及对象数组的使用,实现对当前路径下所有文件的遍历访问。采用正则表达式来实现字符串的模糊匹配。利用defaultListModel和JList的组合关系实现图标和文件的实时展示。
public class FileSearch {
public static void bfsSearchFile(String path,String regex,boolean isDisplyDir,boolean isDisplayFile)
{
boolean isFind = false;
regex = "(.*)" + regex + "(.*)";
if(!(isDisplayFile||isDisplyDir))
{
throw new IllegalArgumentException("isDisplyDir和isDisplayFile中至少要有一个为true");
}
Queue<File> queue=new LinkedList<>();
File[] fs=new File(path).listFiles();
//遍历第一层
for(File f:fs)
{
//把第一层文件夹加入队列
if(f.isDirectory())
{
queue.offer(f);
}
else
{
if(f.getName().matches(regex)&&isDisplayFile)
{
isFind = true;
MainForm._instance.Maps.put(f.getName(), f.getAbsolutePath());
MainForm._instance.defaultListModel.addElement(f.getName());
MainForm._instance.AllIcons[MainForm._instance.Icon_Counter++] = GetFileIcon.getSingleSmallIcon(f.getAbsolutePath());
}
}
}
//逐层搜索下去
while (!queue.isEmpty()) {
File fileTemp=queue.poll();//从队列头取一个元素
if(isDisplyDir)
{
if(fileTemp.getName().matches(regex))
{
isFind = true;
MainForm._instance.Maps.put(fileTemp.getName(), fileTemp.getAbsolutePath());
MainForm._instance.defaultListModel.addElement(fileTemp.getName());
MainForm._instance.AllIcons[MainForm._instance.Icon_Counter++] = GetFileIcon.getSingleSmallIcon(fileTemp.getAbsolutePath());
}
}
File[] fileListTemp=fileTemp.listFiles();
if(fileListTemp==null)
continue;//遇到无法访问的文件夹跳过
for(File f:fileListTemp)
{
if(f.isDirectory())
{
queue.offer(f);////从队列尾插入一个元素
}
else
{
if(f.getName().matches(regex)&&isDisplayFile)
{
isFind = true;
MainForm._instance.Maps.put(f.getName(), f.getAbsolutePath());
MainForm._instance.defaultListModel.addElement(f.getName());
MainForm._instance.AllIcons[MainForm._instance.Icon_Counter++] = GetFileIcon.getSingleSmallIcon(f.getAbsolutePath());
}
}
}
}
if(!isFind){
JOptionPane.showMessageDialog(null, "未找到相关结果", "确认对话框", JOptionPane.YES_OPTION);
}
}
}
目录树
选择文件夹,将指定文件夹的所有文件存入树中,递归遍历目录树,访问当前目录、访问文档,递归遍历子目录,创建文件的路径,通过树路径获取树节点、树节点获取对应的文件节点
public FilesTree() {
this.setLayout(new BorderLayout());
File[] roots = File.listRoots();
FileTreeNode rootTreeNode = new FileTreeNode(roots);
this.tree = new JTree(rootTreeNode);
this.tree.setCellRenderer(new FileTreeCellRenderer());
this.tree.setRootVisible(false);
this.tree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent e) {
if(tree.getLastSelectedPathComponent() == null) return;
String chooseUrl = tree.getLastSelectedPathComponent().toString();
File temp_file = new File(chooseUrl);
if(temp_file.isDirectory()){
MainForm._instance.stack.push(MainForm._instance.Cur_URL);
MainForm._instance.Cur_URL = chooseUrl;
MainForm._instance.Go_There();
}
// System.out.println("我点击的节点的值:" + tree.getLastSelectedPathComponent().toString());
}
});
final JScrollPane jsp = new JScrollPane(this.tree);
jsp.setBorder(new EmptyBorder(0, 0, 0, 0));
this.add(jsp, BorderLayout.CENTER);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
JFrame frame = new JFrame("File tree");
frame.setSize(500, 400);
frame.setLocationRelativeTo(null);
frame.add(new FilesTree());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
打开、删除、重命名文件
当不在搜索状态且当前目录不为空格时,通过文件地址打开文件,如果在搜索状态时则就要从map里提取我们的URL,因为搜索把顺序都打乱了,无法用一个URL对应通过文件地址提取,map中存在的唯一值并新建一个file文件打开它;用renameTo()这个方法实现重命名操作;如果文件存在则通过deleteFile删除文件、通过deleteDirectory删除目录;删除目录时如果目录不以文件分隔符结尾,自动添加文件分隔符;删除子文件或者子目录时用数组。
else if(e.getSource() == JMIs[0] || e.getSource() == JMIs2[0]){ //打开文件/文件夹/磁盘
if(!isSearching){
String url = Cur_URL + list.getSelectedValue();
if(Cur_URL != ""){
url += "\\";
}
File file = new File(url);
if(file.isDirectory()){
twoClick(url);
}else{
OpenIt(file);
}
}else{
File file = new File(Maps.get(list.getSelectedValue()));
OpenIt(file);
}
}
else if(e.getSource() == JMIs[1]) {
File file = new File(Cur_URL + "/" + list.getSelectedValue());
copyArray.clear();
copyArray.add(file);
JMIs[2].setEnabled(true);
}
else if(e.getSource() == JMIs[2]) {
if(copyArray.get(0).isDirectory()) {
FileCopy.copyDir(copyArray.get(0).getAbsolutePath(),Cur_URL);
}
if(copyArray.get(0).isFile()) {
FileCopy.copyFile(copyArray.get(0).getAbsolutePath(),Cur_URL+copyArray.get(0).getName());
File newf =new File(Cur_URL+copyArray.get(0).getName());
MainForm._instance.defaultListModel.addElement(newf.getName());
MainForm._instance.AllIcons[MainForm._instance.Icon_Counter++] = GetFileIcon.getSingleSmallIcon(newf.getAbsolutePath());
}
}
else if(e.getSource() == JMIs[3]){//删除
File file = new File(Cur_URL + "/" + list.getSelectedValue());
int n;
if(file.isFile()){
n = JOptionPane.showConfirmDialog(null, "确定要删除文件 " + file.getName() + " 么?", "文件删除",JOptionPane.YES_NO_OPTION);
}else{
n = JOptionPane.showConfirmDialog(null, "确定要删除 " + file.getName() + " 及其目录下的文件么?", "文件夹删除",JOptionPane.YES_NO_OPTION);
}
if(n == 0){
FileDelete.delete(Cur_URL + list.getSelectedValue() + "\\");
Go_There();
}
}
else if(e.getSource() == delete){//多选下的删除
List<String> selected_str = list.getSelectedValuesList();
File file;
int num = selected_str.size();
int n = JOptionPane.showConfirmDialog(null, "确定要删除 " + selected_str.get(0) + " 等" + num + "项么?", "文件删除",JOptionPane.YES_NO_OPTION);
if(n == 0){
if(isSearching){//如果是正在搜索,从Maps取URL
for(int i = 0; i < selected_str.size(); ++i){
file = new File(Maps.get(selected_str.get(i)));
FileDelete.delete(file.getAbsolutePath());
}
}else{//否则就用Cur_URL拼接获得
for(int i = 0; i < selected_str.size(); ++i){
FileDelete.delete(Cur_URL + selected_str.get(i) + "\\");
}
Go_There();
}
}
}
else if(e.getSource() == JMIs[4]){//重命名
String before = list.getSelectedValue();
File file = new File(Cur_URL + before + "\\");
String after = "";
if(file.isDirectory()){
after = (String) JOptionPane.showInputDialog(null, "请输入新文件夹名:\n", "重命名", JOptionPane.PLAIN_MESSAGE, null, null,
list.getSelectedValue());
}else{
after = (String) JOptionPane.showInputDialog(null, "请输入新文件名:\n", "重命名", JOptionPane.PLAIN_MESSAGE, null, null,
list.getSelectedValue());
}
if(before != after && after != null){
new File(Cur_URL + before + "\\").renameTo(new File(Cur_URL + after + "\\"));
Go_There();
}else{
Go_There();
}
}
九、项目代码扫描结果及改正
扫描结果

改正结果

十、项目总结
本次课设耗时约一周半,java提供的众多类库也给初步学习使用本门语言的组员造成了很多困难。最终经过学习,成员们进一步熟悉到File类,JList和DefaultListModel,JTree等工具,团结协作明确分工基本完成本次课设。由于时间问题,管理器功能有限,仍有很多功能有待改进和增加。后续将继续学习java相关如数据库、JDBC等其余可能有关内容,继续优化。

浙公网安备 33010602011771号