Java语言实现简单FTP软件------>远程文件管理模块的实现(十)
首先看一下界面:
1、远程FTP服务器端的文件列表的显示
将远程的当前目录下所有文件显示出来,并显示文件的属性包括文件名、大小、日期、通过javax.swing.JTable()来显示具体的数据。更改当前文件目录会调用com.oyp.ftp.panel.ftp.FtpPanel类的listFtpFiles(final TelnetInputStream list)方法,其主要代码如下
/**
* 读取FTP文件到表格的方法
* @param list
* 读取FTP服务器资源列表的输入流
*/
public synchronized void listFtpFiles(final TelnetInputStream list) {
// 获取表格的数据模型
final DefaultTableModel model = (DefaultTableModel) ftpDiskTable
.getModel();
model.setRowCount(0);
// 创建一个线程类
Runnable runnable = new Runnable() {
public synchronized void run() {
ftpDiskTable.clearSelection();
try {
String pwd = getPwd(); // 获取FTP服务器的当前文件夹
model.addRow(new Object[] { new FtpFile(".", pwd, true),
"", "" }); // 添加“.”符号
model.addRow(new Object[] { new FtpFile("..", pwd, true),
"", "" }); // 添加“..”符号
byte[]names=new byte[2048];
int bufsize=0;
bufsize=list.read(names, 0, names.length);
int i=0,j=0;
while(i<bufsize){
//字符模式为10,二进制模式为13
// if (names[i]==10) {
if (names[i]==13) {
//获取字符串 -rwx------ 1 user group 57344 Apr 18 05:32 腾讯电商2013实习生招聘TST推荐模板.xls
//文件名在数据中开始做坐标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
String fileMessage = new String(names,j,i-j);
if(fileMessage.length() == 0){
System.out.println("fileMessage.length() == 0");
break;
}
//按照空格将fileMessage截为数组后获取相关信息
// 正则表达式 \s表示空格,{1,}表示1一个以上
if(!fileMessage.split("\\s+")[8].equals(".") && !fileMessage.split("\\s+")[8].equals("..")){
/**文件大小*/
String sizeOrDir="";
if (fileMessage.startsWith("d")) {//如果是目录
sizeOrDir="<DIR>";
}else if (fileMessage.startsWith("-")) {//如果是文件
sizeOrDir=fileMessage.split("\\s+")[4];
}
/**文件名*/
String fileName=fileMessage.split("\\s+")[8];
/**文件日期*/
String dateStr =fileMessage.split("\\s+")[5] +" "+fileMessage.split("\\s+")[6]+" " +fileMessage.split("\\s+")[7];
FtpFile ftpFile = new FtpFile();
// 将FTP目录信息初始化到FTP文件对象中
ftpFile.setLastDate(dateStr);
ftpFile.setSize(sizeOrDir);
ftpFile.setName(fileName);
ftpFile.setPath(pwd);
// 将文件信息添加到表格中
model.addRow(new Object[] { ftpFile, ftpFile.getSize(),
dateStr });
} // j=i+1;//上一次位置为字符模式
j=i+2;//上一次位置为二进制模式
}
i=i+1;
}
list.close();
} catch (IOException ex) {
Logger.getLogger(FTPClientFrame.class.getName()).log(
Level.SEVERE, null, ex);
}
}
};
if (SwingUtilities.isEventDispatchThread()) // 启动线程对象
runnable.run();
else
SwingUtilities.invokeLater(runnable);
}
2、刷新远程FTP服务器端的文件列表
点击“刷新”按钮,会触发com.oyp.ftp.panel.ftp.RefreshAction类的actionPerformed(ActionEvent e)方法,其主要代码如下
/** 刷新按钮的动作处理器动作的事件处理方法 **/
@Override
public void actionPerformed(ActionEvent e) {
ftpPanel.refreshCurrentFolder(); // 调用刷新FTP资源列表的方法
}
上面的响应事件会调用com.oyp.ftp.panel.ftp.FtpPanel类的refreshCurrentFolder()方法,其主要代码如下
/** 刷新FTP资源管理面板的当前文件夹**/
public void refreshCurrentFolder() {
try {
// 获取服务器文件列表
TelnetInputStream list = ftpClient.list();
listFtpFiles(list); // 调用解析方法
} catch (IOException e) {
e.printStackTrace();
}
}
3、新建远程FTP服务器端的文件夹
点击“新建文件夹”按钮,会触发com.oyp.ftp.panel.ftp.CreateFolderAction类的actionPerformed(ActionEvent e)方法,然后弹出一个对话框,填写要新建的文件夹名称,选择“确定”,“取消”按钮结束。其主要代码如下
/**
* 创建文件夹的事件处理方法
*/
@Override
public void actionPerformed(ActionEvent e) {
// 接收用户输入的新建文件夹的名称
String folderName = JOptionPane.showInputDialog("请输入文件夹名称:");
if (folderName == null)
return;
int read = -1;
try {
// 发送创建文件夹的命令
ftpPanel.ftpClient.sendServer("MKD " + folderName + "\r\n");
// 读取FTP服务器的命令返回码
read = ftpPanel.ftpClient.readServerResponse();
} catch (IOException e1) {
e1.printStackTrace();
}
if (read == 257) {// 如果返回码等于257(路径名建立完成)
// 提示文件夹创建成功
JOptionPane.showMessageDialog(ftpPanel, folderName + "文件夹,创建成功。",
"创建文件夹", JOptionPane.INFORMATION_MESSAGE);
}else{
// 否则 提示用户该文件夹无法创建
JOptionPane.showMessageDialog(ftpPanel, folderName + "文件夹无法被创建。",
"创建文件夹", JOptionPane.ERROR_MESSAGE);
}
this.ftpPanel.refreshCurrentFolder();
}
4、 删除远程FTP服务器端的文件
选择好要删除的文件或文件夹,点击“删除”按钮,会触发com.oyp.ftp.panel.ftp.DelFileAction类的actionPerformed(ActionEvent e)方法,然后弹出一个对话框,选择“是”,“否”,“取消”按钮结束。其主要代码如下
public void actionPerformed(ActionEvent e) {
// 获取显示FTP资源列表的表格组件当前选择的所有行
final int[] selRows = ftpPanel.ftpDiskTable.getSelectedRows();
if (selRows.length < 1)
return;
int confirmDialog = JOptionPane.showConfirmDialog(ftpPanel, "确定要删除吗?");
if (confirmDialog == JOptionPane.YES_OPTION) {
Runnable runnable = new Runnable() { /**
* 删除服务器文件的方法
* @param file - 文件名称
*/
private void delFile(FtpFile file) {
FtpClient ftpClient = ftpPanel.ftpClient; // 获取ftpClient实例
try {
if (file.isFile()) { // 如果删除的是文件
ftpClient.sendServer("DELE " + file.getName()
+ "\r\n"); // 发送删除文件的命令
ftpClient.readServerResponse(); // 接收返回编码
} else if (file.isDirectory()) { // 如果删除的是文件夹
ftpClient.cd(file.getName()); // 进入到该文件夹 TelnetInputStream telnetInputStream=ftpClient.list();
byte[]names=new byte[2048];
int bufsize=0;
bufsize=telnetInputStream.read(names, 0, names.length);
int i=0,j=0;
while(i<bufsize){
//字符模式为10,二进制模式为13
// if (names[i]==10) {
if (names[i]==13) {
//获取字符串 -rwx------ 1 user group 57344 Apr 18 05:32 腾讯电商2013实习生招聘TST推荐模板.xls
//文件名在数据中开始做坐标为j,i-j为文件名的长度,文件名在数据中的结束下标为i-1
String fileMessage = new String(names,j,i-j);
if(fileMessage.length() == 0){
System.out.println("fileMessage.length() == 0");
break;
}
//按照空格将fileMessage截为数组后获取相关信息
// 正则表达式 \s表示空格,{1,}表示1一个以上
if(!fileMessage.split("\\s+")[8].equals(".") && !fileMessage.split("\\s+")[8].equals("..")){
/**文件大小*/
String sizeOrDir="";
if (fileMessage.startsWith("d")) {//如果是目录
sizeOrDir="<DIR>";
}else if (fileMessage.startsWith("-")) {//如果是文件
sizeOrDir=fileMessage.split("\\s+")[4];
}
/**文件名*/
String fileName=fileMessage.split("\\s+")[8];
/**文件日期*/
String dateStr =fileMessage.split("\\s+")[5] +fileMessage.split("\\s+")[6] +fileMessage.split("\\s+")[7];
FtpFile ftpFile = new FtpFile();
// 将FTP目录信息初始化到FTP文件对象中
ftpFile.setLastDate(dateStr);
ftpFile.setSize(sizeOrDir);
ftpFile.setName(fileName);
ftpFile.setPath(file.getAbsolutePath());
// 递归删除文件或文件夹
delFile(ftpFile);
}
// j=i+1;//上一次位置为字符模式
j=i+2;//上一次位置为二进制模式
}
i=i+1;
}
ftpClient.cdUp(); // 返回上层文件夹
ftpClient.sendServer("RMD " + file.getName()
+ "\r\n"); // 发送删除文件夹指令
ftpClient.readServerResponse(); // 接收返回码
}
} catch (Exception ex) {
Logger.getLogger(LocalPanel.class.getName()).log(
Level.SEVERE, null, ex);
}
} /**
* 线程的主体方法
*/
public void run() {
// 遍历显示FTP资源的表格的所有选择行
for (int i = 0; i < selRows.length; i++) {
// 获取每行的第一个单元值,并转换为FtpFile类型
final FtpFile file = (FtpFile) ftpPanel.ftpDiskTable
.getValueAt(selRows[i], 0);
if (file != null) {
delFile(file); // 调用删除文件的递归方法
try {
// 向服务器发删除文件夹的方法
ftpPanel.ftpClient.sendServer("RMD "
+ file.getName() + "\r\n");
// 读取FTP服务器的返回码
ftpPanel.ftpClient.readServerResponse();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 刷新FTP服务器资源列表
DelFileAction.this.ftpPanel.refreshCurrentFolder();
JOptionPane.showMessageDialog(ftpPanel, "删除成功。");
}
};
new Thread(runnable).start();
}
}
5、重命名远程FTP服务器端的文件
选择好要重命名的文件或文件夹,点击“重命名”按钮,会触发com.oyp.ftp.panel.ftp.RenameAction类的actionPerformed(ActionEvent e)方法,其主要代码如下
/**
* 重命名FTP文件的事件处理方法
*/
@Override
public void actionPerformed(ActionEvent e) {
// 获取显示FTP资源的表格当前选择行号
int selRow = ftpPanel.ftpDiskTable.getSelectedRow();
if (selRow < 0)
return;
// 获取当前行的第一个表格单元值,并转换成FtpFile类型的对象
FtpFile file = (FtpFile) ftpPanel.ftpDiskTable.getValueAt(selRow, 0);
// 使用对话框接收用户输入的新文件或文件夹名称
String newName = JOptionPane.showInputDialog(ftpPanel, "请输入新名称。");
if (file.getName().equals(".") || file.getName().equals("..")
|| newName == null)
return;
try {
// 向服务器发送重命名的指令
ftpPanel.ftpClient.sendServer("RNFR " + file.getName() + "\r\n"); //对旧路径重命名
ftpPanel.ftpClient.readServerResponse();
ftpPanel.ftpClient.sendServer("RNTO " + newName + "\r\n"); //对新路径重命名
ftpPanel.ftpClient.readServerResponse();
ftpPanel.refreshCurrentFolder(); // 刷新当前文件夹
} catch (IOException e1) {
e1.printStackTrace();
}
}
==================================================================================================
作者:欧阳鹏 欢迎转载,与人分享是进步的源泉!
转载请保留原文地址:http://blog.csdn.net/ouyang_peng
===================================================================================================
Java语言实现简单FTP软件------>远程文件管理模块的实现(十)的更多相关文章
- Java语言实现简单FTP软件------>本地文件管理模块的实现(九)
首先看一下界面: 1.本地文件列表的显示功能 将本地的当前目录下所有文件显示出来,并显示文件的属性包括文件名.大小.日期.通过javax.swing.JTable()来显示具体的数据.更改当前文件目录 ...
- Java语言实现简单FTP软件------>连接管理模块的实现:主机与服务器之间的连接与关闭操作(八)
(1)FTP连接 运行FTP客户端后,首先是连接FTP服务器,需要输入FTP服务器的IP地址及用户名.密码以及端口号后点击连接按钮开始连接FTP服务器,连接流程图如下图所示. 点击"连接&q ...
- Java语言实现简单FTP软件------>源码放送(十三)
Java语言实现简单FTP软件------>FTP协议分析(一) Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二) Java语言实现简单FTP软件----- ...
- Java语言实现简单FTP软件------>上传下载管理模块的实现(十一)
1.上传本地文件或文件夹到远程FTP服务器端的功能. 当用户在本地文件列表中选择想要上传的文件后,点击上传按钮,将本机上指定的文件上传到FTP服务器当前展现的目录,下图为上传子模块流程图 选择好要上传 ...
- Java语言实现简单FTP软件------>FTP软件主界面的实现(四)
首先看一下该软件的整体代码框架 1.首先介绍程序的主入口FTPMain.java,采用了一个漂亮的外观风格 package com.oyp.ftp; im ...
- Java语言实现简单FTP软件------>FTP软件远程窗口的实现(六)
1.首先看一下远程窗口的布局效果 2.看一下本地窗口实现的代码框架 3.远程窗口主要实现代码FtpPanel.java package com.oyp.ftp.panel.ftp; import ja ...
- Java语言实现简单FTP软件------>FTP软件本地窗口的实现(五)
1.首先看一下本地窗口的布局效果 2.看一下本地窗口实现的代码框架 2.本地窗口的具体实现代码LocalPanel.java package com.oyp.ftp.panel.local; impo ...
- Java语言实现简单FTP软件------>上传下载队列窗口的实现(七)
1.首先看一下队列窗口的界面 2.看一下上传队列窗口的界面 3.看一下下载队列窗口的界面 4.队列窗口的实现 package com.oyp.ftp.panel.queue; import stati ...
- Java语言实现简单FTP软件------>FTP软件效果图预览之下载功能(二)
介绍完FTP协议后,来看看该软件完成后的效果图 客户端的主界面如上图所示,主要是分为以下几个界面: 数据输入界面:用来让用户输入服务器的地址,用户名,密码,端口号等. 站点菜单.本地菜单.远程菜单以及 ...
随机推荐
- DevExpress控件之popupMenu
一.首次创建 1.可直接从工具栏拉一个PopupMenu出来, 2.右键Customize,Yes(提示是否自动创建BarManager,并为popupmenu绑定这个BarManager): 3.编 ...
- hdu4671 思维构造
pid=4671">http://acm.hdu.edu.cn/showproblem.php? pid=4671 Problem Description Makomuno has N ...
- 通知传值(NSNotificationCenter)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvenVveW91MTMxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- react-native 极光推送(jpush-react-native)
极光推送官方支持的 React Native 插件 安装 npm install jpush-react-native --savenpm install jcore-react-native --s ...
- ckeditor编辑时 回车 生成一个段落p、解决首行缩进问题
使用ckeditor编辑器时,会自己主动加入上的标签,按回车也会自己主动加入上同样的标签 查看ckeditor编辑器源代码时会看到,点击回车显示的<p> </p> static ...
- Android——点击对话框上button不关闭对话框
有时候我没可能须要在点击button进行一些检測.可是并不想关闭次对话框(系统默认点击不论什么一个button则关闭对话框),处理方法例如以下:在点击事件下加入例如以下代码: try { Field ...
- 【SpringMVC学习10】SpringMVC对RESTfull的支持
RESTful架构,就是目前流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用.RESTful架构对url进行规范,写RESTful格式的url是什么样子 ...
- 关于TCP/IP,这十个问题你都知道,就入门了!
关于TCP/IP,必知必会的十个问题 本文整理了一些TCP/IP协议簇中需要必知必会的十大问题,既是面试高频问题,又是程序员必备基础素养. TCP/IP十个问题 一.TCP/IP模型 TCP/IP ...
- 关于javaSocket中 Software caused connection abort: recv failed问题
在学习Socket中今天突然遇到了以下这种问题 原来是网路连接出了问题,由于我測试的是远程连接所以是在学校的局域网下,结果非常不稳定,開始还以为怎么了一会连上了一会又出现故障然后把IP地址改为本机的1 ...
- C++类型转换运算符 static_cast,dynamic_cast,reinterpret_cast,const_cast
类型转换是一种让程序猿可以临时或永久性改变编译器对对象的解释机制.可改变对象解释方式的运算符称为类型转换运算符. 为何须要进行类型转换 通常为了实现使用不同环境的个人和厂商编写的模块可以相互调用和协作 ...