用Apache Jakarta的common-net包写的访问FTP的程式
2007-11-06 17:18
363 查看
use : commons-net-1.4.1
package com.sinomos.rpt.bean;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
/** *//**
* @applicability 10.1.10.19 10.1.10.20
*/
public class uFtp ...{
private FTPClient ftpClient = null;
//private OutputStream outSteam = null;
//ftp服务器地址
private String hostName;
//ftp服务器默认端口
public static int defaultport = 21;
//登录名
private String userName;
//登录密码
private String password;
//需要访问的远程目录
private String remoteDir;
/** *//**
* @param hostName 主机地址
* @param port 端口号
* @param userName 用户名
* @param password 密码
* @param remoteDir 默认工作目录
* @param is_zhTimeZone 是否是中文FTP Server端
* @return
*/
public uFtp(String hostName,int port,String userName,String password,String remoteDir,boolean is_zhTimeZone) ...{
this.hostName=hostName;
this.userName=userName;
this.password=password;
this.remoteDir=remoteDir==null?"":remoteDir;
this.ftpClient = new FTPClient();
if(is_zhTimeZone) ...{
this.ftpClient.configure(uFtp.Config());
this.ftpClient.setControlEncoding("GBK");
}
this.login();
this.changeDir(this.remoteDir);
this.setFileType(FTPClient.ASCII_FILE_TYPE);
//this.changeDir(this.remoteDir);
ftpClient.setDefaultPort(port);
}
/** *//**
* 登录FTP服务器
*/
public void login() ...{
try ...{
ftpClient.connect(this.hostName);
ftpClient.login(this.userName, this.password);
} catch (FTPConnectionClosedException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("连接到ftp服务器:" + this.hostName + " 成功..开始登录");
}
//FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
private static FTPClientConfig Config() ...{
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setRecentDateFormatStr("MM月dd日 HH:mm");
//conf.setRecentDateFormatStr("(YYYY年)?MM月dd日( HH:mm)?");
return conf;
}
/** *//**
* 变更工作目录
* @param remoteDir--目录路径
*/
public void changeDir(String remoteDir) ...{
try ...{
this.remoteDir = remoteDir;
ftpClient.changeWorkingDirectory(remoteDir);
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("变更工作目录为:"+remoteDir);
}
/** *//**
* 返回上一级目录(父目录)
*/
public void ToParentDir() ...{
try ...{
ftpClient.changeToParentDirectory();
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** *//**
* 列出当前工作目录下所有文件
*/
public String[] ListAllFiles() ...{
String[] names=this.ListFiles("*");
return this.sort(names);
}
/** *//**
* 列出指定工作目录下的匹配文件
* @param dir exp: /cim/
* @param file_regEx 通配符为*
*/
public String[] ListAllFiles(String dir,String file_regEx) ...{
String[] names=this.ListFiles(dir+file_regEx);
return this.sort(names);
}
/** *//**
* 列出匹配文件
* @param file_regEx 匹配字符,通配符为*
*/
public String[] ListFiles(String file_regEx) ...{
try ...{
/**//*
FTPFile[] remoteFiles = ftpClient.listFiles(file_regEx);
//System.out.println(remoteFiles.length);
String[] name = new String[remoteFiles.length];
if(remoteFiles != null) {
for(int i=0;i<remoteFiles.length;i++) {
if(remoteFiles[i] == null)
name[i] = "";
else if(remoteFiles[i].getName()==null||remoteFiles[i].getName().equals(".")||remoteFiles[i].getName().equals("..")) {
name[i] = "";
}
else name[i] = remoteFiles[i].getName();
System.out.println(name[i]);
}
}
*/
String[] name = ftpClient.listNames(file_regEx);
if(name==null)
return new String[0];
return this.sort(name);
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
return new String[0];
}
public void Lists(String reg) ...{
try ...{
String[] a=ftpClient.listNames(reg);
for(String b:a) ...{
System.out.println(b);
}
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** *//**
* 设置传输文件的类型[文本文件或者二进制文件]
* @param fileType--BINARY_FILE_TYPE,ASCII_FILE_TYPE
*/
public void setFileType(int fileType)...{
try...{
ftpClient.setFileType(fileType);
}catch(IOException e)...{
e.printStackTrace();
}
}
/** *//**
* 上传文件
* @param localFilePath--本地文件路径+文件名
* @param newFileName--新的文件名
*/
public void uploadFile(String localFilePath,String newFileName)...{
//上传文件
BufferedInputStream buffIn=null;
try...{
buffIn=new BufferedInputStream(new FileInputStream(localFilePath));
ftpClient.storeFile(newFileName, buffIn);
}catch(Exception e)...{
e.printStackTrace();
}finally...{
try...{
if(buffIn!=null)
buffIn.close();
}catch(Exception e)...{
e.printStackTrace();
}
}
}
/** *//**
* 下载文件(单个)
* @param remoteFileName --服务器上的文件名
* @param localFileName--本地文件名
*/
public String downloadFile(String remoteFileName,String localFileName)...{
BufferedOutputStream buffOut=null;
try...{
buffOut=new BufferedOutputStream(new FileOutputStream(localFileName));
ftpClient.retrieveFile(remoteFileName, buffOut);
}catch(Exception e)...{
e.printStackTrace();
return "";
}finally...{
try...{
if(buffOut!=null)
buffOut.close();
}catch(Exception e)...{
e.printStackTrace();
}
}
return localFileName;
}
/** *//**
* 关闭FTP连接
*/
public void close() ...{
try...{
if(ftpClient!=null)...{
ftpClient.logout();
ftpClient.disconnect();
}
}catch (Exception e)...{
e.printStackTrace();
}
}
/** *//**
* 冒泡排序字符串(从大到小)
*/
public String[] sort(String[] str_Array) ...{
if(str_Array==null) ...{
throw new NullPointerException("The str_Array can not be null!");
}
String tmp = "";
for(int i=0;i<str_Array.length;i++) ...{
for(int j=0;j<str_Array.length-i-1;j++) ...{
if(str_Array[j].compareTo(str_Array[j+1])<0) ...{
tmp = str_Array[j];
str_Array[j] = str_Array[j + 1];
str_Array[j + 1] = tmp;
}
}
}
return str_Array;
}
/** *//**
* @param args
*/
public static void main(String[] args) ...{
// TODO Auto-generated method stub
//String[] files = null;
uFtp ftp = new uFtp("10.1.10.19",uFtp.defaultport,"eda","sinomos","/tyne_home/wat/db/",true);
//uftp.ListFiles();
//ftp.changeDir("/tyne_home/wat/db/");
//String[] s = ftp.ListFiles("*SN_141*.wdf");
//System.out.println(s.length);
ftp.Lists("SN_141.wdf");
//ftp.downloadFile("SN_141.wdf", "Data/SN_141.wdf");
/**//*
System.out.println("==========================");
for(int i=0;i<files.length;i++) {
System.out.println("files["+i+"]:"+files[i]);
}*/
//uftp.uploadFile("D:/TestFile/temp.xml", "temp.xml");
}
}
如果用的是中文的FTP服务器端,则要在Project中重载
org.apache.commons.net.ftp.parser.UnixFTPEntryParser类
/**//*
* Copyright 2001-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.net.ftp.parser;
import java.text.ParseException;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
/** *//**
* Implementation FTPFileEntryParser and FTPFileListParser for standard Unix
* Systems.
*
* This class is based on the logic of Daniel Savarese's DefaultFTPListParser,
* but adapted to use regular expressions and to fit the new FTPFileEntryParser
* interface.
*
* @version $Id: UnixFTPEntryParser.java,v 1.1 2007/01/18 04:20:59 others Exp $
* @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for
* usage instructions)
*/
public class UnixFTPEntryParser extends ConfigurableFTPFileEntryParserImpl ...{
/** *//**
* months abbreviations looked for by this parser. Also used to determine
* which month is matched by the parser
*/
@SuppressWarnings("unused")
private static final String DEFAULT_MONTHS = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
static final String DEFAULT_DATE_FORMAT = "MMM d yyyy"; // Nov 9 2001
static final String DEFAULT_RECENT_DATE_FORMAT = "MMM d HH:mm"; // Nov 9
// 20:06
static final String NUMERIC_DATE_FORMAT = "yyyy-MM-dd HH:mm"; // 2001-11-09
// 20:06
/** *//**
* Some Linux distributions are now shipping an FTP server which formats
* file listing dates in an all-numeric format:
* <code>"yyyy-MM-dd HH:mm</code>. This is a very welcome development,
* and hopefully it will soon become the standard. However, since it is so
* new, for now, and possibly forever, we merely accomodate it, but do not
* make it the default.
* <p>
* For now end users may specify this format only via
* <code>UnixFTPEntryParser(FTPClientConfig)</code>. Steve Cohen -
* 2005-04-17
*/
public static final FTPClientConfig NUMERIC_DATE_CONFIG = new FTPClientConfig(
FTPClientConfig.SYST_UNIX, NUMERIC_DATE_FORMAT, null, null, null,
null);
/** *//**
* this is the regular expression used by this parser.
*
* Permissions: r the file is readable w the file is writable x the file is
* executable - the indicated permission is not granted L mandatory locking
* occurs during access (the set-group-ID bit is on and the group execution
* bit is off) s the set-user-ID or set-group-ID bit is on, and the
* corresponding user or group execution bit is also on S undefined
* bit-state (the set-user-ID bit is on and the user execution bit is off) t
* the 1000 (octal) bit, or sticky bit, is on [see chmod(1)], and execution
* is on T the 1000 bit is turned on, and execution is off (undefined bit-
* state)
*/
private static final String REGEX = "([bcdlfmpSs-])"
+ "(((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-])))/+?/s+"
+ "(/d+)/s+" + "(/S+)/s+" + "(?:(/S+)/s+)?" + "(/d+)/s+"
/**//*
* numeric or standard format date
*/
// + "((?:/d+[-/]/d+[-/]/d+)|(?:/S+/s+/S+))/s+"
// 2007/01/16 Yyong modify to match chinese date format
+ "((?:/d+[-/]/d+[-/]/d+)|(?:/S+/s+/S+)|(?:/d+月/d+日))/s+"
/**//*
* year (for non-recent standard format) or time (for numeric or
* recent standard format
*/
+ "(/d+(?::/d+)?)/s+"
+ "(/S*)(/s*.*)";
/** *//**
* The default constructor for a UnixFTPEntryParser object.
*
* @exception IllegalArgumentException
* Thrown if the regular expression is unparseable. Should
* not be seen under normal conditions. It it is seen, this
* is a sign that <code>REGEX</code> is not a valid regular
* expression.
*/
public UnixFTPEntryParser() ...{
this(null);
}
/** *//**
* This constructor allows the creation of a UnixFTPEntryParser object with
* something other than the default configuration.
*
* @param config
* The {@link FTPClientConfig configuration} object used to
* configure this parser.
* @exception IllegalArgumentException
* Thrown if the regular expression is unparseable. Should
* not be seen under normal conditions. It it is seen, this
* is a sign that <code>REGEX</code> is not a valid regular
* expression.
* @since 1.4
*/
public UnixFTPEntryParser(FTPClientConfig config) ...{
super(REGEX);
configure(config);
}
/** *//**
* Parses a line of a unix (standard) FTP server file listing and converts
* it into a usable format in the form of an <code> FTPFile </code>
* instance. If the file listing line doesn't describe a file,
* <code> null </code> is returned, otherwise a <code> FTPFile </code>
* instance representing the files in the directory is returned.
* <p>
*
* @param entry
* A line of text from the file listing
* @return An FTPFile instance corresponding to the supplied entry
*/
public FTPFile parseFTPEntry(String entry) ...{
FTPFile file = new FTPFile();
file.setRawListing(entry);
int type;
boolean isDevice = false;
if (matches(entry)) ...{
String typeStr = group(1);
String hardLinkCount = group(15);
String usr = group(16);
String grp = group(17);
String filesize = group(18);
String datestr = group(19) + " " + group(20);
String name = group(21);
String endtoken = group(22);
try ...{
file.setTimestamp(super.parseTimestamp(datestr));
} catch (ParseException e) ...{
return null; // this is a parsing failure too.
}
// bcdlfmpSs-
switch (typeStr.charAt(0)) ...{
case 'd':
type = FTPFile.DIRECTORY_TYPE;
break;
case 'l':
type = FTPFile.SYMBOLIC_LINK_TYPE;
break;
case 'b':
case 'c':
isDevice = true;
// break; - fall through
case 'f':
case '-':
type = FTPFile.FILE_TYPE;
break;
default:
type = FTPFile.UNKNOWN_TYPE;
}
file.setType(type);
int g = 4;
for (int access = 0; access < 3; access++, g += 4) ...{
// Use != '-' to avoid having to check for suid and sticky bits
file.setPermission(access, FTPFile.READ_PERMISSION, (!group(g)
.equals("-")));
file.setPermission(access, FTPFile.WRITE_PERMISSION, (!group(
g + 1).equals("-")));
String execPerm = group(g + 2);
if (!execPerm.equals("-")
&& !Character.isUpperCase(execPerm.charAt(0))) ...{
file
.setPermission(access, FTPFile.EXECUTE_PERMISSION,
true);
} else ...{
file.setPermission(access, FTPFile.EXECUTE_PERMISSION,
false);
}
}
if (!isDevice) ...{
try ...{
file.setHardLinkCount(Integer.parseInt(hardLinkCount));
} catch (NumberFormatException e) ...{
// intentionally do nothing
}
}
file.setUser(usr);
file.setGroup(grp);
try ...{
file.setSize(Long.parseLong(filesize));
} catch (NumberFormatException e) ...{
// intentionally do nothing
}
if (null == endtoken) ...{
file.setName(name);
} else ...{
// oddball cases like symbolic links, file names
// with spaces in them.
name += endtoken;
if (type == FTPFile.SYMBOLIC_LINK_TYPE) ...{
int end = name.indexOf(" -> ");
// Give up if no link indicator is present
if (end == -1) ...{
file.setName(name);
} else ...{
file.setName(name.substring(0, end));
file.setLink(name.substring(end + 4));
}
} else ...{
file.setName(name);
}
}
return file;
}
return null;
}
/** *//**
* Defines a default configuration to be used when this class is
* instantiated without a {@link FTPClientConfig FTPClientConfig}
* parameter being specified.
*
* @return the default configuration for this parser.
*/
protected FTPClientConfig getDefaultConfiguration() ...{
return new FTPClientConfig(FTPClientConfig.SYST_UNIX,
DEFAULT_DATE_FORMAT, DEFAULT_RECENT_DATE_FORMAT, null, null,
null);
}
}
package com.sinomos.rpt.bean;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPConnectionClosedException;
/** *//**
* @applicability 10.1.10.19 10.1.10.20
*/
public class uFtp ...{
private FTPClient ftpClient = null;
//private OutputStream outSteam = null;
//ftp服务器地址
private String hostName;
//ftp服务器默认端口
public static int defaultport = 21;
//登录名
private String userName;
//登录密码
private String password;
//需要访问的远程目录
private String remoteDir;
/** *//**
* @param hostName 主机地址
* @param port 端口号
* @param userName 用户名
* @param password 密码
* @param remoteDir 默认工作目录
* @param is_zhTimeZone 是否是中文FTP Server端
* @return
*/
public uFtp(String hostName,int port,String userName,String password,String remoteDir,boolean is_zhTimeZone) ...{
this.hostName=hostName;
this.userName=userName;
this.password=password;
this.remoteDir=remoteDir==null?"":remoteDir;
this.ftpClient = new FTPClient();
if(is_zhTimeZone) ...{
this.ftpClient.configure(uFtp.Config());
this.ftpClient.setControlEncoding("GBK");
}
this.login();
this.changeDir(this.remoteDir);
this.setFileType(FTPClient.ASCII_FILE_TYPE);
//this.changeDir(this.remoteDir);
ftpClient.setDefaultPort(port);
}
/** *//**
* 登录FTP服务器
*/
public void login() ...{
try ...{
ftpClient.connect(this.hostName);
ftpClient.login(this.userName, this.password);
} catch (FTPConnectionClosedException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("连接到ftp服务器:" + this.hostName + " 成功..开始登录");
}
//FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
private static FTPClientConfig Config() ...{
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setRecentDateFormatStr("MM月dd日 HH:mm");
//conf.setRecentDateFormatStr("(YYYY年)?MM月dd日( HH:mm)?");
return conf;
}
/** *//**
* 变更工作目录
* @param remoteDir--目录路径
*/
public void changeDir(String remoteDir) ...{
try ...{
this.remoteDir = remoteDir;
ftpClient.changeWorkingDirectory(remoteDir);
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("变更工作目录为:"+remoteDir);
}
/** *//**
* 返回上一级目录(父目录)
*/
public void ToParentDir() ...{
try ...{
ftpClient.changeToParentDirectory();
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** *//**
* 列出当前工作目录下所有文件
*/
public String[] ListAllFiles() ...{
String[] names=this.ListFiles("*");
return this.sort(names);
}
/** *//**
* 列出指定工作目录下的匹配文件
* @param dir exp: /cim/
* @param file_regEx 通配符为*
*/
public String[] ListAllFiles(String dir,String file_regEx) ...{
String[] names=this.ListFiles(dir+file_regEx);
return this.sort(names);
}
/** *//**
* 列出匹配文件
* @param file_regEx 匹配字符,通配符为*
*/
public String[] ListFiles(String file_regEx) ...{
try ...{
/**//*
FTPFile[] remoteFiles = ftpClient.listFiles(file_regEx);
//System.out.println(remoteFiles.length);
String[] name = new String[remoteFiles.length];
if(remoteFiles != null) {
for(int i=0;i<remoteFiles.length;i++) {
if(remoteFiles[i] == null)
name[i] = "";
else if(remoteFiles[i].getName()==null||remoteFiles[i].getName().equals(".")||remoteFiles[i].getName().equals("..")) {
name[i] = "";
}
else name[i] = remoteFiles[i].getName();
System.out.println(name[i]);
}
}
*/
String[] name = ftpClient.listNames(file_regEx);
if(name==null)
return new String[0];
return this.sort(name);
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
return new String[0];
}
public void Lists(String reg) ...{
try ...{
String[] a=ftpClient.listNames(reg);
for(String b:a) ...{
System.out.println(b);
}
} catch (IOException e) ...{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/** *//**
* 设置传输文件的类型[文本文件或者二进制文件]
* @param fileType--BINARY_FILE_TYPE,ASCII_FILE_TYPE
*/
public void setFileType(int fileType)...{
try...{
ftpClient.setFileType(fileType);
}catch(IOException e)...{
e.printStackTrace();
}
}
/** *//**
* 上传文件
* @param localFilePath--本地文件路径+文件名
* @param newFileName--新的文件名
*/
public void uploadFile(String localFilePath,String newFileName)...{
//上传文件
BufferedInputStream buffIn=null;
try...{
buffIn=new BufferedInputStream(new FileInputStream(localFilePath));
ftpClient.storeFile(newFileName, buffIn);
}catch(Exception e)...{
e.printStackTrace();
}finally...{
try...{
if(buffIn!=null)
buffIn.close();
}catch(Exception e)...{
e.printStackTrace();
}
}
}
/** *//**
* 下载文件(单个)
* @param remoteFileName --服务器上的文件名
* @param localFileName--本地文件名
*/
public String downloadFile(String remoteFileName,String localFileName)...{
BufferedOutputStream buffOut=null;
try...{
buffOut=new BufferedOutputStream(new FileOutputStream(localFileName));
ftpClient.retrieveFile(remoteFileName, buffOut);
}catch(Exception e)...{
e.printStackTrace();
return "";
}finally...{
try...{
if(buffOut!=null)
buffOut.close();
}catch(Exception e)...{
e.printStackTrace();
}
}
return localFileName;
}
/** *//**
* 关闭FTP连接
*/
public void close() ...{
try...{
if(ftpClient!=null)...{
ftpClient.logout();
ftpClient.disconnect();
}
}catch (Exception e)...{
e.printStackTrace();
}
}
/** *//**
* 冒泡排序字符串(从大到小)
*/
public String[] sort(String[] str_Array) ...{
if(str_Array==null) ...{
throw new NullPointerException("The str_Array can not be null!");
}
String tmp = "";
for(int i=0;i<str_Array.length;i++) ...{
for(int j=0;j<str_Array.length-i-1;j++) ...{
if(str_Array[j].compareTo(str_Array[j+1])<0) ...{
tmp = str_Array[j];
str_Array[j] = str_Array[j + 1];
str_Array[j + 1] = tmp;
}
}
}
return str_Array;
}
/** *//**
* @param args
*/
public static void main(String[] args) ...{
// TODO Auto-generated method stub
//String[] files = null;
uFtp ftp = new uFtp("10.1.10.19",uFtp.defaultport,"eda","sinomos","/tyne_home/wat/db/",true);
//uftp.ListFiles();
//ftp.changeDir("/tyne_home/wat/db/");
//String[] s = ftp.ListFiles("*SN_141*.wdf");
//System.out.println(s.length);
ftp.Lists("SN_141.wdf");
//ftp.downloadFile("SN_141.wdf", "Data/SN_141.wdf");
/**//*
System.out.println("==========================");
for(int i=0;i<files.length;i++) {
System.out.println("files["+i+"]:"+files[i]);
}*/
//uftp.uploadFile("D:/TestFile/temp.xml", "temp.xml");
}
}
如果用的是中文的FTP服务器端,则要在Project中重载
org.apache.commons.net.ftp.parser.UnixFTPEntryParser类
/**//*
* Copyright 2001-2005 The Apache Software Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.commons.net.ftp.parser;
import java.text.ParseException;
import org.apache.commons.net.ftp.FTPClientConfig;
import org.apache.commons.net.ftp.FTPFile;
/** *//**
* Implementation FTPFileEntryParser and FTPFileListParser for standard Unix
* Systems.
*
* This class is based on the logic of Daniel Savarese's DefaultFTPListParser,
* but adapted to use regular expressions and to fit the new FTPFileEntryParser
* interface.
*
* @version $Id: UnixFTPEntryParser.java,v 1.1 2007/01/18 04:20:59 others Exp $
* @see org.apache.commons.net.ftp.FTPFileEntryParser FTPFileEntryParser (for
* usage instructions)
*/
public class UnixFTPEntryParser extends ConfigurableFTPFileEntryParserImpl ...{
/** *//**
* months abbreviations looked for by this parser. Also used to determine
* which month is matched by the parser
*/
@SuppressWarnings("unused")
private static final String DEFAULT_MONTHS = "(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)";
static final String DEFAULT_DATE_FORMAT = "MMM d yyyy"; // Nov 9 2001
static final String DEFAULT_RECENT_DATE_FORMAT = "MMM d HH:mm"; // Nov 9
// 20:06
static final String NUMERIC_DATE_FORMAT = "yyyy-MM-dd HH:mm"; // 2001-11-09
// 20:06
/** *//**
* Some Linux distributions are now shipping an FTP server which formats
* file listing dates in an all-numeric format:
* <code>"yyyy-MM-dd HH:mm</code>. This is a very welcome development,
* and hopefully it will soon become the standard. However, since it is so
* new, for now, and possibly forever, we merely accomodate it, but do not
* make it the default.
* <p>
* For now end users may specify this format only via
* <code>UnixFTPEntryParser(FTPClientConfig)</code>. Steve Cohen -
* 2005-04-17
*/
public static final FTPClientConfig NUMERIC_DATE_CONFIG = new FTPClientConfig(
FTPClientConfig.SYST_UNIX, NUMERIC_DATE_FORMAT, null, null, null,
null);
/** *//**
* this is the regular expression used by this parser.
*
* Permissions: r the file is readable w the file is writable x the file is
* executable - the indicated permission is not granted L mandatory locking
* occurs during access (the set-group-ID bit is on and the group execution
* bit is off) s the set-user-ID or set-group-ID bit is on, and the
* corresponding user or group execution bit is also on S undefined
* bit-state (the set-user-ID bit is on and the user execution bit is off) t
* the 1000 (octal) bit, or sticky bit, is on [see chmod(1)], and execution
* is on T the 1000 bit is turned on, and execution is off (undefined bit-
* state)
*/
private static final String REGEX = "([bcdlfmpSs-])"
+ "(((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-]))((r|-)(w|-)([xsStTL-])))/+?/s+"
+ "(/d+)/s+" + "(/S+)/s+" + "(?:(/S+)/s+)?" + "(/d+)/s+"
/**//*
* numeric or standard format date
*/
// + "((?:/d+[-/]/d+[-/]/d+)|(?:/S+/s+/S+))/s+"
// 2007/01/16 Yyong modify to match chinese date format
+ "((?:/d+[-/]/d+[-/]/d+)|(?:/S+/s+/S+)|(?:/d+月/d+日))/s+"
/**//*
* year (for non-recent standard format) or time (for numeric or
* recent standard format
*/
+ "(/d+(?::/d+)?)/s+"
+ "(/S*)(/s*.*)";
/** *//**
* The default constructor for a UnixFTPEntryParser object.
*
* @exception IllegalArgumentException
* Thrown if the regular expression is unparseable. Should
* not be seen under normal conditions. It it is seen, this
* is a sign that <code>REGEX</code> is not a valid regular
* expression.
*/
public UnixFTPEntryParser() ...{
this(null);
}
/** *//**
* This constructor allows the creation of a UnixFTPEntryParser object with
* something other than the default configuration.
*
* @param config
* The {@link FTPClientConfig configuration} object used to
* configure this parser.
* @exception IllegalArgumentException
* Thrown if the regular expression is unparseable. Should
* not be seen under normal conditions. It it is seen, this
* is a sign that <code>REGEX</code> is not a valid regular
* expression.
* @since 1.4
*/
public UnixFTPEntryParser(FTPClientConfig config) ...{
super(REGEX);
configure(config);
}
/** *//**
* Parses a line of a unix (standard) FTP server file listing and converts
* it into a usable format in the form of an <code> FTPFile </code>
* instance. If the file listing line doesn't describe a file,
* <code> null </code> is returned, otherwise a <code> FTPFile </code>
* instance representing the files in the directory is returned.
* <p>
*
* @param entry
* A line of text from the file listing
* @return An FTPFile instance corresponding to the supplied entry
*/
public FTPFile parseFTPEntry(String entry) ...{
FTPFile file = new FTPFile();
file.setRawListing(entry);
int type;
boolean isDevice = false;
if (matches(entry)) ...{
String typeStr = group(1);
String hardLinkCount = group(15);
String usr = group(16);
String grp = group(17);
String filesize = group(18);
String datestr = group(19) + " " + group(20);
String name = group(21);
String endtoken = group(22);
try ...{
file.setTimestamp(super.parseTimestamp(datestr));
} catch (ParseException e) ...{
return null; // this is a parsing failure too.
}
// bcdlfmpSs-
switch (typeStr.charAt(0)) ...{
case 'd':
type = FTPFile.DIRECTORY_TYPE;
break;
case 'l':
type = FTPFile.SYMBOLIC_LINK_TYPE;
break;
case 'b':
case 'c':
isDevice = true;
// break; - fall through
case 'f':
case '-':
type = FTPFile.FILE_TYPE;
break;
default:
type = FTPFile.UNKNOWN_TYPE;
}
file.setType(type);
int g = 4;
for (int access = 0; access < 3; access++, g += 4) ...{
// Use != '-' to avoid having to check for suid and sticky bits
file.setPermission(access, FTPFile.READ_PERMISSION, (!group(g)
.equals("-")));
file.setPermission(access, FTPFile.WRITE_PERMISSION, (!group(
g + 1).equals("-")));
String execPerm = group(g + 2);
if (!execPerm.equals("-")
&& !Character.isUpperCase(execPerm.charAt(0))) ...{
file
.setPermission(access, FTPFile.EXECUTE_PERMISSION,
true);
} else ...{
file.setPermission(access, FTPFile.EXECUTE_PERMISSION,
false);
}
}
if (!isDevice) ...{
try ...{
file.setHardLinkCount(Integer.parseInt(hardLinkCount));
} catch (NumberFormatException e) ...{
// intentionally do nothing
}
}
file.setUser(usr);
file.setGroup(grp);
try ...{
file.setSize(Long.parseLong(filesize));
} catch (NumberFormatException e) ...{
// intentionally do nothing
}
if (null == endtoken) ...{
file.setName(name);
} else ...{
// oddball cases like symbolic links, file names
// with spaces in them.
name += endtoken;
if (type == FTPFile.SYMBOLIC_LINK_TYPE) ...{
int end = name.indexOf(" -> ");
// Give up if no link indicator is present
if (end == -1) ...{
file.setName(name);
} else ...{
file.setName(name.substring(0, end));
file.setLink(name.substring(end + 4));
}
} else ...{
file.setName(name);
}
}
return file;
}
return null;
}
/** *//**
* Defines a default configuration to be used when this class is
* instantiated without a {@link FTPClientConfig FTPClientConfig}
* parameter being specified.
*
* @return the default configuration for this parser.
*/
protected FTPClientConfig getDefaultConfiguration() ...{
return new FTPClientConfig(FTPClientConfig.SYST_UNIX,
DEFAULT_DATE_FORMAT, DEFAULT_RECENT_DATE_FORMAT, null, null,
null);
}
}
相关文章推荐
- Apache Common-net Ftp客户端实例
- java ftp 客户端(apache jakarta commons net ftp)的bug[原创][Bug]
- Apache Common-net Ftp客户端实例
- FTP文件的上传和下载---org.apache.commons.net.ftp.FTPClient
- Apache Jakarta Common Lang 3
- ftp用户权限(其实是PHP的php.ini或APACHE的httpd.conf配置 限制目录访问)
- 关于《common-net》的ftp上传
- org.apache.commons.net.ftp.FTPClient上传、下载、修改文件等功能
- 利用Apache的commons-net实现FTP的文件读取、上传、下载、删除和移动功能
- 使用org.apache.commons.net.ftp包开发FTP客户端,实现进度汇报,实现断点续传,中文支持
- apache.commons.NET.FTP使用小结
- org.apache.commons.net.ftp.FTPClient使用
- 使用org.apache.commons.net.ftp包开发FTP客户端,实现进度汇报,实现断点续
- apache common ,java操作ftp部分
- 让Apache的commons-net-3.3中的FTPClient支持中文
- 使用org.apache.commons.net.ftp包开发FTP客户端,实现进度汇报,实现断点续传,中文支持
- ftpClient(apache提供的commons-net-3.3)
- org.apache.commons.net.ftp.FTPClient----根据文件名,路径检索文件 FTP上传 下载 删除文件
- apache-commons-net Ftp 进行文件、文件夹的上传下载及日志的输出
- apache.commons.net.ftp.FTPClient上传FTP