程序员
代码搬运工

001-文件系统

Windows课程设计

 

 

 

1、模块概述

由于计算机的普及,人们将越来越多的文件存储在计算机上。这样如果没有定期的对系统文件进行分类,删除过期文件,系统文件会越来越多,不方便查找。文件批量处理模块为了方便管理文件而设计,通过本模块可以快速地实现文件的批量复制、批量删除、批量重命名、文件分类等。

2、功能结构

文件批处理模块主要由文件管理、编辑、工具三个子模块组成,模块的功能结构图如图1所示。

图1  模块功能结构图

 

3、模块设计

3.1主窗体设计

文件批量处理模块的主窗体,可以分为菜单栏、工具栏、树组件显示文件系统文件夹、表格组件显示文件信息四个部分。主窗体运行结果如图2所示。

 

图2  主窗体运行结果图

3.1.1 菜单栏设计

在主窗体中包括三个菜单,分别为“文件”、“编辑”、“工具”。通过“文件”菜单可以实现新建文件等功能,通过“编辑”菜单可以实现文件的批量删除、复制、移动功能,通过“工具”菜单可以实现对文件的分类。

3.1.2 工具栏设计

工具栏为进入某个功能模块提供了快捷方法。在文件批量处理模块主界面中设计了工具栏,并在工具栏中添加了4个按钮。分别为“新建文件”按钮、“文件搜索”按钮、“文件分类”按钮和“退出系统”按钮。

3.1.3 实现显示系统文件夹

文件批量处理模块主窗体中,使用JTree组件显示系统文件结构,类似Windows系统中的包资源管理器。该JTree组件根节点为“桌面”。通过本模块的JTree组件不仅可以检索本地系统中的文件,并且可以通过“网上邻居”浏览临近电脑。由于展开树组件需要很大空间,可以将其放在滚动窗格中。

实现通过树组件来显示系统文件夹,应该创建MyNode类,来设置树组件中的各个节点,MyNode类继承DefaultMutableTreeNode类。DefaultMutableTreeNode类是树结构中的通用节点。

实现在树组件中显示系统文件结构,需要确定根节点以及各个子节点。在本模块中,将“桌面”设置为树结构的根节点。通过FileSystem类的getRoots()方法可以获取系统的所有根分区,在Windows系统中将是“桌面”文件夹,而在DOS系统中将是从“A:”到“Z:”的驱动器。本模块将实例化JTree组件包装在getTree()方法中。

3.1.4 实现显示系统文件夹中的文件

当单击树结构中的某个子节点后,可以将用户选择的某个地址中的文件,在主界面设计的数据表中将文件夹下的文件信息显示在主窗体中。见上图2所示。

当单击树结构中的某个节点后,系统会根据该节点所指示的地址将其中的文件信息添加到表格中。完成此功能,首先创建检索文件夹中文件的方法getFileList(),该方法以String对象作为参数,然后在调用该方法时,可以通过给定的不同的参数将系统文件夹中的文件信息检索出来。

要实现当点击指定的节点,系统将会将该节点所指向的文件路径中的文件信息添加到表格中的功能,应该在树组件中添加鼠标监听器。

3.2新建文件

文件批量处理模块中添加了新建文件、文件夹的功能。

3.2.1 实现新建文件

用户可以通过单击“文件”菜单中的“新建文件”菜单项,完成新建文件功能。“新建文件”窗体运行结果如图3所示:

 

图3  新建文件运行结果图

在“新建文件”窗体中,当用户单击“文件路径”后,将弹出文件选择对话框,用户可以选择新建文件的保存路径,系统会将用户选择的路径添加到“文件路径”文本框中。文件选择对话框包装在MyFileChooser类中。

当用户单击“创建”按钮后,会调用新建文件方法createFile(),在“创建”按钮的单击事件中,首先判断用户选择新建文件的路径和文件名是否为空,其次,还需要判断在指定的路径中是否存在于用户输入的文件名相同的文件。只有在用户确定了新建文件的路径和文件名,并且在该路径中不存在与用户输入的文件名相同的文件时,系统才会在选定路径的文件夹下创建指定文件名的文件,完成新建文件的操作。

3.2.2 实现新建文件夹

当用户单击“文件”菜单中的“新建文件夹”菜单项后,会弹出“新建文件”窗体,用户设置新建文件夹的路径和文件夹名称。“新建文件”窗体运行结果如图4所示:

 

图4  “新建文件夹”窗体

实现过程与“新建文件”大同小异。

3.3文件搜索

文件搜索是按指定的文件格式进行搜索。搜索界面如图5所示。

 

图5  文件搜索主窗体运行结果

实现将本地有效盘符在窗体中显示的功能,需要将获取到的本地有效盘符信息添加到窗体的下拉列表中。

用户在确定要搜索的文件扩展名,选择要进行搜索的地址,单击搜索按钮后,系统将启动新线程在指定的盘符中搜索文件,将文件信息显示在表格中,并给出文件的总数。

3.4文件复制

通过文件批处理模块,可以快速地实现批量复制。为了方便用户操作,在批量复制子模块中,设计实现了按照文件格式批量进行复制,以及复制整个文件夹内容的功能。

3.4.1 实现复制指定文件

当用户一次单击“编辑”菜单中的“批量复制”/“复制指定文件”的菜单项时,可以批量复制指定的文件。通过批量复制指定文件子模块,可以将用户选择文件夹中指定格式的文件全部复制到相应的文件夹中,批量复制指定文件子模块的运行结果如图6所示:

 

图6  批量复制指定文件

实现批量复制指定文件,首先需要获取用户选择的文件夹中的文件集合,如果集合中的元素与用户要进行复制的文件扩展名相同,则调用复制文件方法,完成文件复制。

当用户单击上图6所示的“复制”按钮后,可以完成文件的复制。在“复制”按钮菜单单击事件中,首先判断用户是否输入了完整的文件地址和复制地址。由于用户指定的文件夹中可能会有很多符合条件的文件,完成复制可能需要些时间,为了达到界面友好的效果,需要给用户提供相应的提示信息,即当系统正在复制文件时,会调用MyHint类,提示用户正在复制文件。需要注意的是,如果复制文件需要的时间很短,这个窗体可能不会被显示。

3.4.2 实现复制整个文件夹

当用户单击“编辑”按下的“批量复制”/“复制整个文件夹”菜单项时,可以实现将用户选择的文件夹复制到相应位置。复制文件夹窗体运行结果如图7所示:

 

图7  “复制文件夹”窗体

完成复制整个文件夹内容,首先需要编写复制整个文件夹方法copyFolder()。该方法有两个String参数,分别代表要进行复制的文件夹地址和复制文件的保存地址。通过调用copyFolder()方法不仅可以实现复制该文件下的所有文件,而且包括子文件夹中的文件内容。

当用户单击如图7所示窗体中的“保存”按钮后,系统将调用复制文件夹方法。由于用户要进行复制的的文件夹可能会有很多文件,为了避免在复制大量文件时会出现死机现象,这里在单独的线程中完成复制文件夹。在“保存”按钮单击事件中,完成复制文件地址的检测以及启动线程。

最后在线程的run()方法中调用复制文件夹方法copyFolder(),并指定复制文件夹的路径和复制后的保存路径。为了区分,复制后的文件夹名称在源文件夹名称后加上“Copy”。

3.5文件移动

文件一定是指将文件从原地址中,移动到另一个地址中。文件移动的设计思想为,将文件复制到指定文件夹中,并将原地址中的文件删除。

3.5.1 实现移动指定文件

当用户单击“编辑”按下的“批量移动”/“移动指定文件”菜单项时,可以实现批量移动文件功能。批量移动指定文件窗体运行结果如图8所示。

 

图8  批量移动指定文件

完成移动文件,需要将用户要移动的文件复制到相应地址,复制文件的方法见上3.4.1文件复制,复制之后再将原地址中的文件删除。当用户单击“移动”按钮后,即可完成文件移动。由于要移动的文件可能会很多,为了避免在文件移动过程中出现死机现象,这里在单独线程中完成文件的移动。在“移动”按钮的单击事件中,完成检测“文件地址”、“移动地址”文本框是否为空,并启动线程。

调用线程的start()方法开启线程,会调用线程run()方法。在run()方法中实现文件移动。

3.5.2 实现移动整个文件夹

当用户单击“编辑”按下的“批量移动”/“移动文件夹”菜单项时,系统将根据用户选择的文件地址与移动地址,完成移动整个文件夹操作。移动整个文件夹窗体运行结果如图9所示:

 

图9  移动整个文件夹

实现移动整个文件夹,需要将移动的文件夹复制到用户输入的“保存路径”文本框指定的地址中,再将原文件删除。实现复制整个文件夹的方法见3.4.2。在上图9所示的“移动”按钮的单击事件中,完成验证“文件路径”、“保存路径”文本框中的文件地址是否合法并启动新线程。

在线程的run()方法中实现复制文件,并将原地址中的文件删除。

3.6文件删除

文件批量处理模块添加了批量删除的功能。通过该子模块可以快速地实现删除文件操作。在批量删除子模块中可是设置进行删除的文件扩展名,还可以通过文件最后一次修改的时间进行删除操作。文件批量删除窗体运行结果如图10所示。

 

图10  文件批量删除窗体

在上图10所示的批量删除窗体中,可是设置要删除的文件的扩展名、文件最后一次修改的日期,并将满足条件的文件信息显示在窗体下方的文件列表中。

3.6.1 扩展名下拉列表设计

在下拉列表中包含常见的文件格式,方便用户指定要删除的文件格式。在扩展名下拉列表中添加了ItemListener监听器,当扩展名下拉列表中的值发生变化时,会调用itemStateChange()方法。通过此方法调用selectItem()方法,该方法中实现了向文件列表中添加数据的功能。

3.6.2 文件日期文本框设计

在文件批量处理窗体中,设计了“文件日期”文本框。用户可以通过文件日期文本框中的日期来指定文件地址中的文件。将最后一次修改日期在用户给定的两个日期之间的文件信息添加到文件信息列表中。

  1. 编写比较时间前后方法

文件列表中显示的文件信息,是最后一次修改时间在“文件日期”文本框中两个日期之间的文件信息。因此需要编写比较两个日期前后的方法。

  1. 设计文件日期文本框

用户在文件日期文本框中可以输入标准时间。系统将按照用户输入的时间,与文件最后一次修改的时间相比较。这里在文件日期文本框中添加了焦点监听事件,实现文本框失去焦点时判断用户是否输入合法的日期。

当用户单击“删除”按钮后,系统会将文件信息列表中列出的文件进行删除操作。

3.7文件分类

本模块实现了文件分类整理的功能,当用户有大量的个类型的文件要进行分类时,通过本模块进行分类会更加方便和快捷。使用文件管理模块的分类功能,可以将选择的文件夹下的文件按照文件类型进行分类,并分别放到以文件扩展名为名称的文件夹中。文件分类管理界面运行结果如图11所示。

 

图11  文件分类管理界面

实现文件的分类管理需要检索用户选择的文件夹中的文件,获取文件扩展名并将相同文件格式的文件放置在以该文件扩展名命名的文件夹中。当用户单击“分类地址”按钮时,系统将弹出文件选择对话框,用户可以选择进行分类的地址。系统将在单独的线程中进行文件分类管理。

在线程run()方法中,实现文件的分类管理。首先获取用户选择路径中的文件扩展名,然后按照扩展名创建文件夹,最后将对应的文件复制到相应的文件夹中。

4、关键函数或功能的实现步骤或思路

4.1 文件操作与读写

文件批量处理模块在对文件及文件夹进行批量处理时,主要用到了输入输出流技术。操作文件流的类都位于java.io包中。本模块中主要用到了File类、FileInputStream类和FileOutputStream类。

  1. File类

File类定义了一些与平台无关的方法来操作文件,可以通过调用File类中的方法,实现创建、删除和移动文件等功能。

File类提供了多种构造函数,本模块主要应用了第1种构造函数来创建File对象。

语法:

File file = new File(String pathName);

参数说明:

PathName:指定路径名称。例如:

File file = new File(“D://name.txt “);

File类中提供了文件操作的常用方法,例如本模块中用到了新建文件(文件夹)、文件删除等方法。

  • createNewFile()

当指定抽象路径中不包含指定文件时,会创建文件。如果抽象路径中包含该文件,不会创建文件。

例如本模块实现新建文件的方法中,首先判断指定文件夹目录下是否存在指定文件,如果不存在则调用createNewFile()方法创建文件,关键代码如下:

File file = new File(myFileName);

if(!file.exists()){

file.createNewFile();

}

  • mkdir()

创建此抽象路径中指定文件目录。本模块中创建文件夹通过该方法实现,关键代码如下:

String filePath = strPath;

File myFilePath = new File(filePath);

if(!myFilePath.exists()){

myFilePath.mkdir();

}

  • delete()

删除文件或文件夹方法,如果要删除指定文件夹,必须保证删除的文件夹为空,才能进行删除。例如本模块中删除整个文件夹的方法deleteDirs(),关键代码如下:

/**

* @param file 要删除的文件对象

*/

public void deleteDirs(File file){

if(file.exists()){ //如果该文件存在

if(file.isFile()){ //并且是文件对象

file.delete(); //将文件删除

}

else if(file.isDirectory()){ //如果该文件对象是路径

File[] files = file.listFiles(); //遍历文件中的文件对象

for(int i = 0;i<files.length;i++){

this.deleteDirs(files[i]);

}

file.delete();

}

}

}

  • listFiles()

返回一个抽象路径数组,这些路径名表示此抽象路径名的文件名称。例如在本模块中检索某文件夹下的所有文件方法中,利用listFiles()方法获取指定文件夹下的所有文件,关键代码如下:

LinkedList filelist = new LinkedList(); //创建List实例

File dir = new File(strPath); //创建File对象

File[] file = dir.listFiles(); //获取File路径中的文件集合if((file != null)&&file.length >0){

for (int i = 0; i < file.length; i++) { //循环遍历数组

if (file[i].isDirectory()) { //如果数组中某个元素是一个路径 getFileList(file[i].getAbsolutePath()); //重新调用本方法

} else {

filelist.add(file[i]);

}

}

}

2.FileInputStream类和FileOutputStream类

FileInputStream类和FileOutputStream类提供了文件操作的基本功能,FileInputStream类提供了读取文件的能力,FileOutputStream类提供了写入文件的基本能力。FileInputStream类通过read()方法读取文件信息,FileOutputStream类通过write()方法向文件写入内容。

例如read()有三种重载形式。

  • read()

从此输入流中读取一个数据字节。如果没有输入可用,则此方法阻塞。

  • read(byte[] b)

从此输入流中将最多b.length个字节的数据读入一个byte数组中。在某些输入可用之前,此方法将阻塞。

  • read(byte[] b,int off,int len)

从此输入流中将最多len个字节的数据读入一个byte数组中。如果len不为零,则在输入可用之前,该方法将阻塞;否则不读取任何字节并返回0。

例如在本模块中实现复制文件时,首先通过FileInputStream类对文件进行读取,再通过FileOutputStream类将文件写入另一个文件中。关键代码如下:

public void copyFile(String oldPath, String newPath) {

try {

int bytesum = 0;

int byteread = 0;

File oldfile = new File(oldPath);

if (oldfile.exists()) { // 文件存在时

//读入原文件

InputStream inStream = new FileInputStream(oldPath);

// 写入文件

FileOutputStream fs = new FileOutputStream(newPath);   byte[] buffer = new byte[1444]; //指定byte数组

//循环获取要读入文件的字节大小

while ((byteread = inStream.read(buffer)) != -1) { bytesum += byteread; // 字节数 文件大小

fs.write(buffer, 0, byteread);

}

inStream.close();

}

} catch (Exception e) {

e.printStackTrace();

}

}

4.2 获取系统有效盘符

不同计算机的系统盘符是不相同的,有的计算机有“C:”、“D:”、“E:”、“F:”盘,而有的计算机只有“C:”、“D:”盘。那么如何获取本地有效盘符是难点之一。本模块在文件搜索子模块中,设计按照本地指定盘符进行搜索文件,将检索出来的有效盘符添加到下拉了列表中。

4.3 表格控件的使用

本模块多出使用到JTable组件来显示系统文件的属性,使用JTable组件可以允许用户编辑数据,但需要注意的是,JTable并没有包含或减缓任何数据,它只是数据的视图。如图***所示,使用表格控件显示某文件夹下的文件名、文件大小。文件的创建日期等信息。

JTable提供了多个构造函数,可方便地创建表格对象。下面给出两种常见的构造函数语法。

  • JTable(Object[][] rowData,Object[] columnNames)

构造一个JTable来显示二维数组rowData中的值,其列名称为columnNames。所有行的长度必须与columnNames的长度相同。

  • JTable(int numRows,int numColumns)

使用DefaultTableModel构造具有numRows行和numColumns列JTable。列名采用“A”、“B”、“C”等形式。

虽然使用这些构造函数可以便于使用JTable组件,但是使用构造函数也具有一些限制。例如通过第1种构造函数创建的表格组件,表格中的数据类型会被看作是相同的String类型数据。如果这样表格中具有boolean数据会将boolean数据显示成一个字符串,或者使用构造函数创建的表格对象,会自动使每一个单元格可编辑。如果要摆脱这些限制,必须实现自己的表格模型。

使用表格模型可以帮助表格以最合适的格式显示数据,并且使用构造函数创建的表格对象,各单元格时可编辑的,而通过表格模型可以设置表格中的列是否可编辑。

文件批量处理模块中创建表格模型,关键代码如下:

Public class LocalTableModel extends

javax.swing.table.DefaultTableModel{

Class[] types = new Class[] { java.lang.Object.class,

java.lang.String.class, java.lang.String.class };

boolean[] canEdit = new boolean[] { false, false, false };

public LocalTableModel() {

super(new Object[][] {}, new String[] { “文件名”, “大小”, “日期” }); }      //定义表格列名

public Class getColumnClass(int columnIndex) {

return types[columnIndex];   //获取指定列的数据类型

}

public boolean isCellEditable(int rowIndex, int columnIndex) {

return canEdit[columnIndex];    //设置单元格不可编辑

}

}

创建成功表格后,可以根据定义的表格模型创建表格对象。文件批量处理模块中,实现创建JTable组件并设置表格模型的关键代码如下:

Private JTable getFileList(){

If(fileList == null ){

fileList = new JTable(); //实例化表格模型

}

fileList.setModel(new LocalTableModel()); //设置表格模型

return fileList;

}

创建表格对象成功后,需要对表格进行维护,例如向表格中添加新数据行、修改表格中某一个单元格的值,清空表格等。这些操作可以通过维护表格模型来完成。

向表格中添加新的数据行,可以使用addRow()方法完成。通过该方法的多种重载形式可以实现将数据添加到表格尾部,或者表格中的指定位置。具体语法如下:

  • addRow(Object[] rowData)

将由数组封装的数据添加到表格模型的尾部。

  • addRow(Vector rowData)

将由向量封装的数据添加到表格模型的尾部。

  • InsertRow(int row,Object[] rowData)

将由数组封装的数据添加到表格模型的指定索引位置。

  • InsertRow(int row,Vector rowData)

将由向量封装的逐句添加到表格模型的指定索引位置。

5、主要功能的测试方案与效果

鉴于整个模块的功能仅限于文件/文件夹的新建、复制、移动、删除、显示和分类,故允许逐个进行功能手工测试。

首先是测试上述主体功能在正确配置下能否实现,这里的正确配置是指比如复制文件时,存在选中文件,也存在复制后存放地址的路径。然后是分别对每个子模块中,在路径选择或文件名为空的情况下,即数据输入不完全的情况下模块是否会实现自动验证然后提示信息并拒绝执行相应操作。最后是线程测试,在某个线程执行时其他操作的阻塞与否(子模块中很多操作都使用了单独线程执行)。

经调试后确认本模块已完成分析阶段所要求的所有功能,可以实现对文件/文件夹的新建、复制、移动、删除、显示和分类操作,基本达到预期目标。对于手动输入错误数据(比如新建文件时输入不存在的路径)的情况下模块的检测功能,由于未在之前设计之内,未能实现,这亦是需要改进之处。

6、使用说明文档

在开发本文件批量处理模块时,需要具备下面的开发环境。

  • 操作系统:Windows 2003/XP
  • Java开发包JDK 6.0

其中包含了JRE(Java Runtime Environment,Java运行环境),即运行JAVA程序所必须的环境的集合,包含JVM标准实现及Java核心类库。

  • 可选开发平台:Eclipse 3.5或NetBeans IDE 6.1

 

运行本模块需在安装了JRE的Windows 2003/XP系统下。

 

以Eclipse集成开发平台为例说明模块的使用。

(1)启动Eclipse。

(2)选择“File(文件)”/“Import(导入)”菜单项,展开“General(常规)”节点,选择“Existing Projects into Workspace(现有项目到工作空间中)”子节点。

(3)单击【Next(下一步)】按钮,单击【Browse(浏览)】按钮,选择程序所在目录,然后勾选“Copy projects into workspace(将项目复制到工作空间中)”复选框。

(4)单击【Finish(完成)】按钮。

(5)在导入工程的src文件中,找到可执行的主类FileBatch.java,在该类上单击鼠标右键,选择“Run As(运行方式)”/“Java Application(Java应用程序)”项,完成程序配置。(注:Netbeans平台下的程序配置与此大同小异,注意文件编码即可)

运行程序后,打开程序主界面。本程序主要实现了新建文件、复制、移动、删除等功能。

在“文件”菜单中可执行新建文件及文件夹、检索文件操作。

在“编辑”菜单中可执行批量复制、移动及删除文件操作。

在“工具”菜单中可执行文件分类操作。

另:在安装了JRE的Windows 2003/XP系统下可以直接双击已经打包好的filebatch.jar文件运行程序。

7、总结与评价

 

 

添加微信

发送 java001   免费领取

 

 

赞(0)
未经允许不得转载:java项目,毕业项目,数据采集mysql数据库 » 001-文件系统
分享到: 更多 (0)

相关推荐

  • 暂无文章

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址