面向对象综合设计-简易文件资源管理器

一、团队介绍

组员姓名

任务分配

黄凌钰(组长) 按关键字检索文件、代码管理
廖山荣 对文件及磁盘的基本操作、博客编写
吴雨芃 筛选指定目录下的文件、目录树

二、本项目的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等其余可能有关内容,继续优化。

posted @ 2021-01-26 16:36  Vancciiii  阅读(188)  评论(0)    收藏  举报