package fenet.ac.pub.acFtp;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import fenet.ac.util.FtpClient;
import fenet.mdp.pub.DateUtil;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
public class FtpClientUtil {
FtpClient ftpClient;
private String server;
private int port;
private String userName;
private String userPassword;
public FtpClientUtil(String server, int port, String userName,
String userPassword) {
this.server = server;
this.port = port;
this.userName = userName;
this.userPassword = userPassword;
}
/**
* 鏈接到服務器
*
* @return
*/
public boolean open() {
if (ftpClient != null && ftpClient.serverIsOpen())
return true;
try {
ftpClient = new FtpClient();
// ftpClient.setEncoding("GBK");
ftpClient.openServer(server, port);
ftpClient.login(userName, userPassword);
ftpClient.binary();
return true;
} catch (Exception e) {
e.printStackTrace();
ftpClient = null;
return false;
}
}
// 新建
public boolean cd(String dir) {
boolean f = false;
try {
ftpClient.cd(dir);
} catch (IOException e) {
// Logs.error(e.toString());
return f;
}
return true;
}
/**
* 上傳文件到FTP服務器
*
* @param localPathAndFileName
* 本地文件目錄和文件名
* @param ftpFileName
* 上傳後的文件名
* @param ftpDirectory
* FTP目錄如:/path1/pathb2/,如果目錄不存在回自動創建目錄
* @throws Exception
*/
public boolean upload(String localDirectoryAndFileName, String ftpFileName,
String ftpDirectory) throws Exception {
if (!open())
return false;
FileInputStream is = null;
TelnetOutputStream os = null;
try {
char ch = ' ';
if (ftpDirectory.length() > 0)
ch = ftpDirectory.charAt(ftpDirectory.length() - 1);
for (; ch == '/' || ch == '\\'; ch = ftpDirectory
.charAt(ftpDirectory.length() - 1))
ftpDirectory = ftpDirectory.substring(0,
ftpDirectory.length() - 1);
int slashIndex = ftpDirectory.indexOf(47);
int backslashIndex = ftpDirectory.indexOf(92);
int index = slashIndex;
String dirall = ftpDirectory;
if (backslashIndex != -1 && (index == -1 || index > backslashIndex))
index = backslashIndex;
String directory = "";
while (index != -1) {
if (index > 0) {
String dir = dirall.substring(0, index);
directory = directory + "/" + dir;
ftpClient.sendServer("XMKD " + directory + "\r\n");
ftpClient.readServerResponse();
}
dirall = dirall.substring(index + 1);
slashIndex = dirall.indexOf(47);
backslashIndex = dirall.indexOf(92);
index = slashIndex;
if (backslashIndex != -1
&& (index == -1 || index > backslashIndex))
index = backslashIndex;
}
ftpClient.sendServer("XMKD " + ftpDirectory + "\r\n");
ftpClient.readServerResponse();
os = ftpClient.put(ftpDirectory + "/" + ftpFileName);
File file_in = new File(localDirectoryAndFileName);
is = new FileInputStream(file_in);
byte bytes[] = new byte[1024];
int i;
while ((i = is.read(bytes)) != -1)
os.write(bytes, 0, i);
// 清理垃圾
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (is != null)
is.close();
if (os != null)
os.close();
}
}
/**
* 從FTP服務器上下載文件並返回下載文件長度
*
* @param ftpDirectoryAndFileName
* @param localDirectoryAndFileName
* @return
* @throws Exception
*/
public long download(String ftpDirectoryAndFileName,
String localDirectoryAndFileName) throws Exception {
long result = 0;
if (!open())
return result;
TelnetInputStream is = null;
FileOutputStream os = null;
try {
is = ftpClient.get(ftpDirectoryAndFileName);
java.io.File outfile = new java.io.File(localDirectoryAndFileName);
os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result + c;
}
} catch (Exception e) {
throw e;
} finally {
if (is != null)
is.close();
if (os != null)
os.close();
}
return result;
}
/**
* 返回FTP目錄下的文件列表
*
* @param ftpDirectory
* @return
*/
public List<String> getFileNameList(String ftpDirectory) {
List<String> list = new ArrayList<String>();
if (!open())
return list;
try {
BufferedReader dr = new BufferedReader(new InputStreamReader(
ftpClient.nameList(ftpDirectory), "gbk"));
String s = "";
while ((s = dr.readLine()) != null) {
list.add(s);
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 獲取Ftp根目錄下詳細信息
*/
public List getFileList() {
List<String> list = new ArrayList<String>();
try {
BufferedReader dr = new BufferedReader(new InputStreamReader(
ftpClient.list(), "gbk"));
String s = "";
while ((s = dr.readLine()) != null) {
// System.out.println(s);
// processStr(s);
list.add(s);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
// 獲取具體文件名稱
public String processStr(String s, int ind) {
String tempStr = "";
int count = 0;
java.util.StringTokenizer st = new java.util.StringTokenizer(s);
// tempStr=st.nextToken();
while (st.hasMoreTokens()) {
tempStr = st.nextToken();
count++;
if (count == ind) // 跳過前面的8個屬性
break;
}
if (ind >= 9) {
tempStr = s.substring(s.indexOf(tempStr));
}
return tempStr;
// String fileName= s.substring(s.indexOf(tempStr));
// System.out.println(fileName);
}
/**
* 刪除FTP上的文件
*
* @param ftpDirAndFileName
*/
public boolean deleteFile(String ftpDirAndFileName) {
if (!open())
return false;
ftpClient.sendServer("DELE " + ftpDirAndFileName + "\r\n");
return true;
}
/**
* 刪除FTP目錄
*
* @param ftpDirectory
*/
public boolean deleteDirectory(String ftpDirectory) {
if (!open())
return false;
ftpClient.sendServer("XRMD " + ftpDirectory + "\r\n");
return true;
}
/**
* 關閉鏈接
*/
public void close() {
try {
if (ftpClient != null && ftpClient.serverIsOpen())
ftpClient.closeServer();
} catch (Exception e) {
}
}
/**
* 測試Main
*
* @param args
*/
public static void main(String[] args) {
FtpClientUtil ftp = new FtpClientUtil("10.197.14.72", 21, "xp", "xp");
//ftp.open();
/*
* try { ftp.upload("E:/Workspace_PR.sws", "/a", ""); } catch (Exception
* e) { e.printStackTrace(); }
*/
/*ftp.cd("/cebfis");
List<String> list = ftp.getFileList();
for (String string : list) {
// System.out.println(ftp.processStr(string,11));
System.out.println(string);
// String[] time={ftp.processStr(string, 6),ftp.processStr(string,
// 7),ftp.processStr(string, 8)};
// System.out.println(ftp.getTime(time));
}*/
//System.out.println(ftp.toString(102400000));
//ftp.close();
}
/**
* 時間格式處理
*
* @param ins
* [] 0:月 1:日 2:年
* @return
*/
public String getTime(String[] ins) {
/*
* 1月 January Jan. 2月 February Feb. 3月 March Mar. 4月April Apr. 5月 May
* May 6月 June Jun. 7月 July Jul. 8月 August Aug. 9月 September Sept. 10月
* October Oct. 11月 November Nov. 12月 December Dec.
*/
String month = ins[0];
String day = ins[1];
String time_year = ins[2];
String time = "";
// 判斷時間
if (month.equalsIgnoreCase("Jan")) {
month = "1";
} else if (month.equalsIgnoreCase("Feb")) {
month = "2";
} else if (month.equalsIgnoreCase("Mar")) {
month = "3";
} else if (month.equalsIgnoreCase("Apr")) {
month = "4";
} else if (month.equalsIgnoreCase("May")) {
month = "5";
} else if (month.equalsIgnoreCase("Jun")) {
month = "6";
} else if (month.equalsIgnoreCase("Jul")) {
month = "7";
} else if (month.equalsIgnoreCase("Aug")) {
month = "8";
} else if (month.equalsIgnoreCase("Sept")) {
month = "9";
} else if (month.equalsIgnoreCase("Oct")) {
month = "10";
} else if (month.equalsIgnoreCase("Nov")) {
month = "11";
} else if (month.equalsIgnoreCase("Dec")) {
month = "12";
}
if (time_year.indexOf(":") == -1) {
time = time_year + "-" + month + "-" + day;
} else {
time = DateUtil.getCurrentDateString("yyyy") + "-" + month + "-"
+ day + " " + time_year;
}
return time;
}
public FtpClientUtil() {
// TODO Auto-generated constructor stub
}
// bt字節參考量
private static final long SIZE_BT = 1024L;
// KB字節參考量
private static final long SIZE_KB = SIZE_BT * 1024L;
// MB字節參考量
private static final long SIZE_MB = SIZE_KB * 1024L;
// GB字節參考量
private static final long SIZE_GB = SIZE_MB * 1024L;
// TB字節參考量
private static final long SIZE_TB = SIZE_GB * 1024L;
private static final int SACLE = 2;
/**
* 文件大小屬性
* @param longSize
* @return
* @throws RuntimeException
*/
public String toSizeString(long longSize) throws RuntimeException {
try {
// 調用計算文件或目錄大小方法
if ( longSize >= 0 && longSize < SIZE_BT) {
return longSize + "B";
} else if (longSize >= SIZE_BT && longSize < SIZE_KB) {
return longSize / SIZE_BT + "KB";
} else if (longSize >= SIZE_KB && longSize < SIZE_MB) {
return longSize / SIZE_KB + "MB";
} else if (longSize >= SIZE_MB && longSize < SIZE_GB) {
BigDecimal longs = new BigDecimal(Double.valueOf(
longSize + "").toString());
BigDecimal sizeMB = new BigDecimal(Double.valueOf(SIZE_MB + "")
.toString());
String result = longs.divide(sizeMB, SACLE,
BigDecimal.ROUND_HALF_UP).toString();
// double result=longSize/(double)SIZE_MB;
return result + "GB";
} else {
BigDecimal longs = new BigDecimal(Double.valueOf(
longSize + "").toString());
BigDecimal sizeMB = new BigDecimal(Double.valueOf(SIZE_GB + "")
.toString());
String result = longs.divide(sizeMB, SACLE,
BigDecimal.ROUND_HALF_UP).toString();
return result + "TB";
}
} catch (Exception ex) {
ex.printStackTrace();
throw new RuntimeException(ex.getMessage());
}
}
}
//此類是關鍵
package fenet.ac.util;
public class FtpClient extends sun.net.ftp.FtpClient {
public FtpClient() {
sun.net.NetworkClient .encoding = "GBK";
}
public static void setEncoding(String encodingStr) {
sun.net.NetworkClient .encoding = encodingStr;
}
}