package raistlin.ftp; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.StringTokenizer; import sun.net.TelnetInputStream; import sun.net.ftp.FtpClient; @SuppressWarnings({"unused","deprecation"}) public class FtpTools { public static int BUFFER_SIZE = 10240; private FtpClient m_client; private String host; private String port; private String user; private String password; private String sDir; private static boolean DEBUG = false; public FtpTools(String host,String port,String user,String password,String sDir) { this.host=host; this.port=port; this.user=user; this.password=password; this.sDir=sDir; } public FtpTools(String host,String port,String user,String password) { this.host=host; this.port=port; this.user=user; this.password=password; this.sDir="/"; } public void connect(){ try { System.out.println("Connecting to host " + host); m_client = new FtpClient(host); m_client.login(user, password); System.out.println("User " + user + " login OK"); // System.out.println(m_client.welcomeMsg); m_client.cd(sDir); m_client.binary(); System.out.println("Success."); System.out.println("Directory: " + sDir); } catch (Exception ex) { System.out.println("Error: " + ex.toString()); } } public void pwd(){ try { String sDir = m_client.pwd(); sDir = new String(sDir.getBytes("ISO-8859-1"),"utf-8"); System.out.println("Directory: " + sDir); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("Error: " + e.toString()); } } public void cwd(String sDir){ try { this.sDir = sDir; m_client.cd(sDir); System.out.println("Directory: " + sDir); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("Error: " + e.toString()); } } public void disconnect(){ if (m_client != null) { try { m_client.closeServer(); } catch (IOException ex) { } m_client = null; } System.out.println("Disconnect."); } public static int getFileSize(FtpClient client, String fileName) throws IOException { TelnetInputStream lst = client.list(); String str = ""; fileName = fileName.toLowerCase(); while (true) { int c = lst.read(); char ch = (char) c; if (c < 0 || ch == '/n') { str = new String(str.getBytes("ISO-8859-1"),"utf-8"); str = str.toLowerCase(); if (str.indexOf(fileName) >= 0) { StringTokenizer tk = new StringTokenizer(str); int index = 0; while (tk.hasMoreTokens()) { String token = tk.nextToken(); if (index == 4) try { return Integer.parseInt(token); } catch (NumberFormatException ex) { return -1; } index++; } } str = ""; } if (c <= 0) break; str += ch; } return -1; } public static ArrayList<String> getFileList(FtpClient client, String sDir) throws IOException { ArrayList<String> fileList = new ArrayList<String>(); String sDir_original = client.pwd(); sDir_original = new String(sDir_original.getBytes("ISO-8859-1"),"utf-8"); client.cd(sDir); TelnetInputStream lst = client.list(); DataInputStream dis = new DataInputStream(lst); String str = null; while ((str = dis.readLine()) != null) { if (str.startsWith("d")) { continue; } str = new String(str.getBytes("ISO-8859-1"),"utf-8"); if (DEBUG) { System.out.println(str); } String fName = str.substring(1 + str.lastIndexOf(" ")); if (DEBUG) { System.out.println(fName); } fileList.add(fName); } client.cd(sDir_original); return fileList; } public static ArrayList<String> getSubDirectoriesList(FtpClient client, String sDir) throws IOException { ArrayList<String> dNameList = new ArrayList<String>(); String sDir_original = client.pwd(); sDir_original = new String(sDir_original.getBytes("ISO-8859-1"),"utf-8"); client.cd(sDir); TelnetInputStream lst = client.list(); DataInputStream dis = new DataInputStream(lst); String str = null; while ((str = dis.readLine()) != null) { if (str.startsWith("d")) { str = new String(str.getBytes("ISO-8859-1"),"utf-8"); if (DEBUG) { System.out.println(str); } String dName = str.substring(1 + str.lastIndexOf(" ")); if (DEBUG) { System.out.println(dName); } dNameList.add(dName); } } client.cd(sDir_original); return dNameList; } public static boolean isDirectory(FtpClient client,String dName) { String sDir = ""; try { sDir = client.pwd(); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("Error: " + e.toString()); return false; } try { sDir = new String(sDir.getBytes("ISO-8859-1"),"utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("Error: " + e.toString()); } if(DEBUG){ System.out.println(sDir); } ArrayList<String> dNameList = null; try { dNameList = getSubDirectoriesList(client,sDir); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("Error: " + e.toString()); return false; } if(dNameList.contains(dName)){ if(DEBUG){ System.out.println(dName + " is Directory."); } return true; }else{ if(DEBUG){ System.out.println(dName + " is not Directory."); } return false; } } public static boolean exists(FtpClient client,String sDir,String fName){ String sDir_original = ""; ArrayList<String> fNameList = null; try { sDir_original = client.pwd(); sDir_original = new String(sDir_original.getBytes("ISO-8859-1"),"utf-8"); } catch (IOException e) { // TODO Auto-generated catch block // e.printStackTrace(); System.out.println("Error: " + e.toString()); // return false; } try{ // sDir = new String(sDir.getBytes("ISO-8859-1"),"utf-8"); if(DEBUG){ System.out.println(sDir); } fNameList = getFileList(client,sDir); if(fNameList.contains(fName)){ if(DEBUG){ System.out.println(fName + " exists."); } return true; }else{ if(DEBUG){ System.out.println(fName + " does not exists."); } // return false; } }catch(Exception ex){ System.out.println("Error: " + ex.toString()); try { client.cd(sDir_original); // return false; } catch (IOException e) { // TODO Auto-generated catch block System.out.println("Error: " + e.toString()); // return false; } } return false; } protected void getFile(String m_sHostFile,String m_sLocalFile) { if (m_sLocalFile.length() == 0) { m_sLocalFile = m_sHostFile; } byte[] buffer = new byte[BUFFER_SIZE]; try { //if file already exits ,delete and recreate File f = new File(m_sLocalFile); if(f.exists()){ if(DEBUG){ System.out.println("File "+m_sLocalFile+" already exists, overwrite"); } f.delete(); } // int size = getFileSize(m_client, m_sHostFile); if (size > 0) { if(DEBUG){ System.out.println("File " + m_sHostFile + ": " + size + " bytes"); } // System.out.println(size); } else System.out.println("File " + m_sHostFile + ": size unknown"); FileOutputStream out = new FileOutputStream(f); InputStream in = m_client.get(m_sHostFile); int counter = 0; while (true) { int bytes = in.read(buffer); if (bytes < 0) break; out.write(buffer, 0, bytes); counter += bytes; } out.close(); in.close(); } catch (Exception ex) { System.out.println("Error: " + ex.toString()); } } protected void getFile(String m_sHostFile,String m_sLocalFile,String d_sLocalDir) { File d = new File(d_sLocalDir); if(d.exists()){ if(d.isDirectory()){ }else{ d.mkdirs(); } }else{ d.mkdirs(); } if (m_sLocalFile.length() == 0) { m_sLocalFile = m_sHostFile; } byte[] buffer = new byte[BUFFER_SIZE]; try { //if file already exits ,delete and recreate File f = new File(d_sLocalDir+"/"+m_sLocalFile); if(f.exists()){ if(DEBUG){ System.out.println("File "+m_sLocalFile+" already exists, overwrite"); } f.delete(); } // int size = getFileSize(m_client, m_sHostFile); if (size > 0) { if(DEBUG){ System.out.println("File " + m_sHostFile + ": " + size + " bytes"); } // System.out.println(size); } else System.out.println("File " + m_sHostFile + ": size unknown"); FileOutputStream out = new FileOutputStream(f); InputStream in = m_client.get(m_sHostFile); int counter = 0; while (true) { int bytes = in.read(buffer); if (bytes < 0) break; out.write(buffer, 0, bytes); counter += bytes; } out.close(); in.close(); } catch (Exception ex) { System.out.println("Error: " + ex.toString()); } } protected void putFile(String m_sLocalFile,String m_sHostFile) { if (m_sLocalFile.length() == 0) { System.out.println("Please enter file name"); } byte[] buffer = new byte[BUFFER_SIZE]; try { File f = new File(m_sLocalFile); int size = (int) f.length(); if(DEBUG){ System.out.println("File " + m_sLocalFile + ": " + size + " bytes"); // System.out.println(size); } FileInputStream in = new FileInputStream(f); OutputStream out = m_client.put(m_sHostFile); int counter = 0; while (true) { int bytes = in.read(buffer); if (bytes < 0) break; out.write(buffer, 0, bytes); counter += bytes; if(DEBUG){ System.out.println(counter); } } out.close(); in.close(); } catch (Exception ex) { System.out.println("Error: " + ex.toString()); } } public static void main(String[] args) throws IOException{ System.out.println("test 1"); FtpTools ftp = new FtpTools("127.0.0.1","21","raistlin","15414","/测试/测试目录"); ftp.connect(); System.out.println(); System.out.println("test 2"); ftp.pwd(); ftp.cwd("/测试"); System.out.println(); System.out.println("test 3"); ftp.pwd(); FtpTools.getFileList(ftp.m_client, "/raistlin"); System.out.println(); System.out.println("test 4"); ftp.pwd(); FtpTools.getSubDirectoriesList(ftp.m_client, "/"); System.out.println(); System.out.println("test 5"); ftp.pwd(); ftp.cwd("/测试"); System.out.println(FtpTools.getFileSize(ftp.m_client, "测试.jpg")); System.out.println(); System.out.println("test 6"); ftp.pwd(); System.out.println(FtpTools.isDirectory(ftp.m_client, "测试目录")); System.out.println(); System.out.println("test 7"); ftp.pwd(); ftp.cwd("/测试"); ftp.getFile("测试.jpg", ""); System.out.println(); System.out.println("test 8"); ftp.pwd(); ftp.cwd("/测试"); ftp.getFile("测试.jpg", "", "c:/temp/test"); System.out.println(); System.out.println("test 9"); ftp.pwd(); ftp.cwd("/"); ftp.putFile("c:/temp/测试/测试.jpg", "测试图片.jpg"); System.out.println(); System.out.println("test 10"); ftp.pwd(); System.out.println(FtpTools.exists(ftp.m_client, "/测试", "测试.txt")); System.out.println(); System.out.println("test end"); ftp.pwd(); ftp.disconnect(); } }