本文为大家分享了FTP本地文件管理模块的实现方法,供大家参考,具体内容如下
首先看一下界面:
1、本地文件列表的显示功能
将本地的当前目录下所有文件显示出来,并显示文件的属性包括文件名、大小、日期、通过javax.swing.JTable()来显示具体的数据。更改当前文件目录会调用com.oyp.ftp.panel.local.LocalPanel类的listLocalFiles()方法,其主要代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/** * 读取本地文件到表格的方法 */ private void listLocalFiles(File selDisk) { if (selDisk == null || selDisk.isFile()) { return ; } localSelFilePathLabel.setText(selDisk.getAbsolutePath()); File[] listFiles = selDisk.listFiles(); // 获取磁盘文件列表 // 获取表格的数据模型 DefaultTableModel model = (DefaultTableModel) localDiskTable.getModel(); model.setRowCount( 0 ); // 清除模型的内容 model.addRow( new Object[] { "." , "<DIR>" , "" }); // 创建.选项 model.addRow( new Object[] { ".." , "<DIR>" , "" }); // 创建..选项 if (listFiles == null ) { JOptionPane.showMessageDialog( this , "该磁盘无法访问" ); return ; } // 遍历磁盘根文件夹的内容,添加到表格中 for (File file : listFiles) { File diskFile = new DiskFile(file); // 创建文件对象 String length = file.length() + "B " ; // 获取文件大小 if (file.length() > 1000 * 1000 * 1000 ) { // 计算文件G单位 length = file.length() / 1000000000 + "G " ; } if (file.length() > 1000 * 1000 ) { // 计算文件M单位 length = file.length() / 1000000 + "M " ; } if (file.length() > 1000 ) { length = file.length() / 1000 + "K " ; // 计算文件K单位 } if (file.isDirectory()) { // 显示文件夹标志 length = "<DIR>" ; } // 获取文件的最后修改日期 String modifDate = new Date(file.lastModified()).toLocaleString(); if (!file.canRead()) { length = "未知" ; modifDate = "未知" ; } // 将单个文件的信息添加到表格的数据模型中 model.addRow( new Object[] { diskFile, length, modifDate }); } localDiskTable.clearSelection(); // 取消表格的选择项 } |
2、本地文件列表的刷新功能
点击“刷新”按钮,会触发com.oyp.ftp.panel.local.RefreshAction类的actionPerformed(ActionEvent e)方法,其主要代码如下
1
2
3
4
5
6
7
|
/** * 刷新本地资源列表的动作处理器的事件处理方法 */ @Override public void actionPerformed(ActionEvent e) { this .localPanel.refreshCurrentFolder(); // 调用管理面板的刷新方法 } |
上面的响应事件会调用com.oyp.ftp.panel.local.LocalPanel类的refreshCurrentFolder()方法,其具体代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/** * 刷新指定文件夹的方法 */ void refreshFolder(File file) { listLocalFiles(file); } /** * 刷新本地当前文件夹的方法 */ public void refreshCurrentFolder() { final File file = getCurrentFolder(); // 获取当前文件夹 Runnable runnable = new Runnable() { // 创建新的线程 public void run() { listLocalFiles(file); // 重载当前文件夹的列表到表格中 } }; //导致 runnable 的 run 方法在 EventQueue 的指派线程上被调用。 SwingUtilities.invokeLater(runnable); // 在事件线程中调用该线程对象 } |
3、 新建本地文件夹功能
点击“新建文件夹”按钮,会触发com.oyp.ftp.panel.local.CreateFolderAction类的actionPerformed(ActionEvent e)方法,然后弹出一个对话框,填写要新建的文件夹名称,选择“确定”,“取消”按钮结束。其主要代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
/** * 创建文件夹按钮的动作处理器的动作事件的方法 */ @Override public void actionPerformed(ActionEvent e) { // 使用输入对话框接收用户输入的文件夹名称 String folderName = JOptionPane.showInputDialog( "请输入文件夹名称:" ); if (folderName == null ) return ; File curFolder = null ; // 获取本地资源表格的当前选择行号 int selRow = localPanel.localDiskTable.getSelectedRow(); if (selRow < 0 ) { // 创建当前文件夹对象 curFolder = new File(localPanel.localSelFilePathLabel.getText()); } else { // 获取表格选择行的第一个单元值 Object value = localPanel.localDiskTable.getValueAt(selRow, 0 ); if (value instanceof File) { // 如果单元值是文件,则获取文件的上级文件夹 curFolder = (File) value; if (curFolder.getParentFile() != null ) curFolder = curFolder.getParentFile(); } else // 否则根据界面的路径标签创建当前文件夹对象 curFolder = new File(localPanel.localSelFilePathLabel.getText()); } // 创建当前文件夹下的新文件夹对象 File tempFile = new File(curFolder, folderName); if (tempFile.exists()) { // 如果存在相同文件或文件夹 JOptionPane.showMessageDialog(localPanel, folderName + "创建失败,已经存在此名称的文件夹或文件。" , "创建文件夹" , JOptionPane.ERROR_MESSAGE); // 提示用户名称已存在 return ; // 结束本方法 } if (tempFile.mkdir()) // 创建文件夹 JOptionPane.showMessageDialog(localPanel, folderName + "文件夹,创建成功。" , "创建文件夹" , JOptionPane.INFORMATION_MESSAGE); else JOptionPane.showMessageDialog(localPanel, folderName + "文件夹无法被创建。" , "创建文件夹" , JOptionPane.ERROR_MESSAGE); this .localPanel.refreshFolder(curFolder); // 刷新文件夹 } |
4、删除本地文件功能
选择好要删除的文件或文件夹,点击“删除”按钮,会触发com.oyp.ftp.panel.local.DelFileAction类的actionPerformed(ActionEvent e)方法,然后弹出一个对话框,选择“是”,“否”,“取消”按钮结束。其主要代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
/** * 删除本地文件的动作处理器的处理动作事件的方法 */ public void actionPerformed(ActionEvent e) { // 获取表格选择的所有行 final int [] selRows = this .localPanel.localDiskTable.getSelectedRows(); if (selRows.length < 1 ) // 如果没有选择表格内容 return ; // 结束该方法 int confirmDialog = JOptionPane.showConfirmDialog(localPanel, "确定要执行删除吗?" ); // 用户确认是否删除 if (confirmDialog == JOptionPane.YES_OPTION) { // 如果用于同意删除 Runnable runnable = new Runnable() { // 创建线程 /** * 删除文件的递归方法 * * @param file * 要删除的文件对象 */ private void delFile(File file) { try { if (file.isFile()) { // 如果删除的是文件 boolean delete = file.delete(); // 调用删该文件的方法 if (!delete) { JOptionPane.showMessageDialog(localPanel, file .getAbsoluteFile() + "文件无法删除。" , "删除文件" , JOptionPane.ERROR_MESSAGE); return ; } } else if (file.isDirectory()) { // 如果删除的是文件夹 File[] listFiles = file.listFiles(); // 获取该文件夹的文件列表 if (listFiles.length > 0 ) { for (File subFile : listFiles) { delFile(subFile); // 调用递归方法删除该列表的所有文件或文件夹 } } boolean delete = file.delete(); // 最后删除该文件夹 if (!delete) { // 如果成功删除 JOptionPane.showMessageDialog(localPanel, file .getAbsoluteFile() + "文件夹无法删除。" , "删除文件" , JOptionPane.ERROR_MESSAGE); return ; // 返回方法的调用处 } } } catch (Exception ex) { Logger.getLogger(LocalPanel. class .getName()).log( Level.SEVERE, null , ex); } } /** * 线程的主体方法 * * @see java.lang.Runnable#run() */ public void run() { File parent = null ; // 遍历表格的选择内容 for ( int i = 0 ; i < selRows.length; i++) { // 获取每个选择行的第一列单元内容 Object value = DelFileAction. this .localPanel.localDiskTable .getValueAt(selRows[i], 0 ); // 如果该内容不是DiskFile类的实例对象 if (!(value instanceof DiskFile)) continue ; // 结束本次循环 DiskFile file = (DiskFile) value; if (parent == null ) parent = file.getParentFile(); // 获取选择文件的上级文件夹 if (file != null ) { delFile(file); // 调用递归方法删除选择内容 } } // 调用refreshFolder方法刷新当前文件夹 DelFileAction. this .localPanel.refreshFolder(parent); JOptionPane.showMessageDialog(localPanel, "删除成功。" ); } }; new Thread(runnable).start(); // 创建并启动这个线程 } } |
5、重命名本地文件功能
选择好要重命名的文件或文件夹,点击“重命名”按钮,会触发com.oyp.ftp.panel.local.RennameAction类的actionPerformed(ActionEvent e)方法,其主要代码如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
/** * 重命名动作的事件处理方法 */ @Override public void actionPerformed(ActionEvent e) { // 获取本地资源表格的选择行号 int selRow = this .localPanel.localDiskTable.getSelectedRow(); if (selRow < 0 ) return ; // 获取选择行的第一个单元值 Object value = this .localPanel.localDiskTable.getValueAt(selRow, 0 ); if (!(value instanceof File)) return ; // 将该单元值转换为File类的对象 File file = (File) value; // 使用对话框接收用户如入的新文件名 String fileName = JOptionPane .showInputDialog( "请输入新文件名" , file.getName()); if (fileName == null ) return ; // 创建新名称的文件 File renFile = new File(file.getParentFile(), fileName); boolean isRename = file.renameTo(renFile); // 将原文件重命名 // 刷新文件夹 this .localPanel.refreshFolder(file.getParentFile()); if (isRename) { JOptionPane.showMessageDialog( this .localPanel, "重命名为" + fileName + "成功。" ); } else { JOptionPane.showMessageDialog( this .localPanel, "无法重命名为" + fileName + "。" , "文件重命名" , JOptionPane.ERROR_MESSAGE); } } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:http://blog.csdn.net/ouyang_peng/article/details/9953667