package com.lyis.commons.util; import it.sauronsoftware.ftp4j.FTPClient; import it.sauronsoftware.ftp4j.FTPException; import it.sauronsoftware.ftp4j.FTPFile; import java.io.File; import java.net.URL; import java.util.Arrays; import java.util.Comparator; import org.apache.log4j.Logger; /** * FTP文件处理工具类 * * @author Johnson * @version Tuesday December 28th, 2010 */ public class FTPUtils { private Logger log = Logger.getLogger(this.getClass()); private static FTPUtils ftp; /** * FTP服务地址 */ private static String ADDRESS = PropUtils.getString("ftp_server_address"); /** * FTP登录用户名 */ private static String USERNAME = PropUtils.getString("ftp_server_username"); /** * FTP登录密码 */ private static String PASSWORD = PropUtils.getString("ftp_server_password"); /** * 构造方法 */ protected FTPUtils() { } /** * 实例化对象 * * @return */ public static FTPUtils getInstance() { if (ftp == null) { ftp = new FTPUtils(); } return ftp; } /** * 获取FTP客户端对象 * * @return * @throws Exception */ private FTPClient getClient() throws Exception { FTPClient client = new FTPClient(); client.setCharset("utf-8"); client.setType(FTPClient.TYPE_BINARY); URL url = new URL(FTPUtils.ADDRESS); int port = url.getPort() < 1 ? 21 : url.getPort(); log.info("Ftp server listening on address " + url.toString()); client.connect(url.getHost(), port); client.login(FTPUtils.USERNAME, FTPUtils.PASSWORD); return client; } /** * 注销客户端连接 * * @param client * FTP客户端对象 * @throws Exception */ private void logout(FTPClient client) throws Exception { if (client != null) { try { // 有些FTP服务器未实现此功能,若未实现则会出错 client.logout(); // 退出登录 } catch (FTPException fe) { } catch (Exception e) { throw e; } finally { if (client.isConnected()) { // 断开连接 client.disconnect(true); } } } } /** * 创建目录 * * @param client * FTP客户端对象 * @param dir * 目录 * @throws Exception */ private void mkdirs(FTPClient client, String dir) throws Exception { if (dir == null) { return; } dir = dir.replace("//", "/"); String[] dirs = dir.split("/"); for (int i = 0; i < dirs.length; i++) { dir = dirs[i]; if (!StringUtils.isEmpty(dir)) { if (!exists(client, dir)) { client.createDirectory(dir); } client.changeDirectory(dir); } } } /** * 获取FTP目录 * * @param url * 原FTP目录 * @param dir * 目录 * @return * @throws Exception */ private URL getURL(URL url, String dir) throws Exception { String path = url.getPath(); if (!path.endsWith("/") && !path.endsWith("//")) { path += "/"; } dir = dir.replace("//", "/"); if (dir.startsWith("/")) { dir = dir.substring(1); } path += dir; return new URL(url, path); } /** * 获取FTP目录 * * @param dir * 目录 * @return * @throws Exception */ private URL getURL(String dir) throws Exception { return getURL(new URL(FTPUtils.ADDRESS), dir); } /** * 判断文件或目录是否存在 * * @param client * FTP客户端对象 * @param dir * 文件或目录 * @return * @throws Exception */ private boolean exists(FTPClient client, String dir) throws Exception { return getFileType(client, dir) != -1; } /** * 判断当前为文件还是目录 * * @param client * FTP客户端对象 * @param dir * 文件或目录 * @return -1、文件或目录不存在 0、文件 1、目录 * @throws Exception */ private int getFileType(FTPClient client, String dir) throws Exception { FTPFile[] files = null; try { files = client.list(dir); } catch (Exception e) { return -1; } if (files.length > 1) { return FTPFile.TYPE_DIRECTORY; } else if (files.length == 1) { FTPFile f = files[0]; if (f.getType() == FTPFile.TYPE_DIRECTORY) { return FTPFile.TYPE_DIRECTORY; } String path = dir + "/" + f.getName(); try { int len = client.list(path).length; if (len == 1) { return FTPFile.TYPE_DIRECTORY; } else { return FTPFile.TYPE_FILE; } } catch (Exception e) { return FTPFile.TYPE_FILE; } } else { try { client.changeDirectory(dir); client.changeDirectoryUp(); return FTPFile.TYPE_DIRECTORY; } catch (Exception e) { return -1; } } } /** * 上传文件或目录 * * @param dir * 目标文件 * @param del * 是否删除源文件,默认为false * @param file * 文件或目录对象数组 * @throws Exception */ public void upload(String dir, boolean del, File... files) throws Exception { if (StringUtils.isEmpty(dir) || StringUtils.isEmpty(files)) { return; } FTPClient client = null; try { client = getClient(); mkdirs(client, dir); // 创建文件 for (File file : files) { if (file.isDirectory()) { // 上传目录 uploadFolder(client, getURL(dir), file, del); } else { client.upload(file); // 上传文件 if (del) { // 删除源文件 file.delete(); } } } } finally { logout(client); } } /** * 上传文件或目录 * * @param dir * 目标文件 * @param files * 文件或目录对象数组 * @throws Exception */ public void upload(String dir, File... files) throws Exception { upload(dir, false, files); } /** * 上传文件或目录 * * @param dir * 目标文件 * @param del * 是否删除源文件,默认为false * @param path * 文件或目录路径数组 * @throws Exception */ public void upload(String dir, boolean del, String... paths) throws Exception { if (StringUtils.isEmpty(paths)) { return; } File[] files = new File[paths.length]; for (int i = 0; i < paths.length; i++) { files[i] = new File(paths[i]); } upload(dir, del, files); } /** * 上传文件或目录 * * @param dir * 目标文件 * @param paths * 文件或目录路径数组 * @throws Exception */ public void upload(String dir, String... paths) throws Exception { upload(dir, false, paths); } /** * 上传目录 * * @param client * FTP客户端对象 * @param parentUrl * 父节点URL * @param file * 目录 * @throws Exception */ private void uploadFolder(FTPClient client, URL parentUrl, File file, boolean del) throws Exception { client.changeDirectory(parentUrl.getPath()); String dir = file.getName(); // 当前目录名称 URL url = getURL(parentUrl, dir); if (!exists(client, url.getPath())) { // 判断当前目录是否存在 client.createDirectory(dir); // 创建目录 } client.changeDirectory(dir); File[] files = file.listFiles(); // 获取当前文件夹所有文件及目录 for (int i = 0; i < files.length; i++) { file = files[i]; if (file.isDirectory()) { // 如果是目录,则递归上传 uploadFolder(client, url, file, del); } else { // 如果是文件,直接上传 client.changeDirectory(url.getPath()); client.upload(file); if (del) { // 删除源文件 file.delete(); } } } } /** * 删除文件或目录 * * @param dir * 文件或目录数组 * @throws Exception */ public void delete(String... dirs) throws Exception { if (StringUtils.isEmpty(dirs)) { return; } FTPClient client = null; try { client = getClient(); int type = -1; for (String dir : dirs) { client.changeDirectory("/"); // 切换至根目录 type = getFileType(client, dir); // 获取当前类型 if (type == 0) { // 删除文件 client.deleteFile(dir); } else if (type == 1) { // 删除目录 deleteFolder(client, getURL(dir)); } } } finally { logout(client); } } /** * 删除目录 * * @param client * FTP客户端对象 * @param url * FTP URL * @throws Exception */ private void deleteFolder(FTPClient client, URL url) throws Exception { String path = url.getPath(); client.changeDirectory(path); FTPFile[] files = client.list(); String name = null; for (FTPFile file : files) { name = file.getName(); // 排除隐藏目录 if (".".equals(name) || "..".equals(name)) { continue; } if (file.getType() == FTPFile.TYPE_DIRECTORY) { // 递归删除子目录 deleteFolder(client, getURL(url, file.getName())); } else if (file.getType() == FTPFile.TYPE_FILE) { // 删除文件 client.deleteFile(file.getName()); } } client.changeDirectoryUp(); client.deleteDirectory(url.getPath()); // 删除当前目录 } /** * 下载文件或目录 * * @param localDir * 本地存储目录 * @param dirs * 文件或者目录 * @throws Exception */ public void download(String localDir, String... dirs) throws Exception { if (StringUtils.isEmpty(dirs)) { return; } FTPClient client = null; try { client = getClient(); File folder = new File(localDir); if (!folder.exists()) { // 如果本地文件夹不存在,则创建 folder.mkdirs(); } int type = -1; String localPath = null; for (String dir : dirs) { client.changeDirectory("/"); // 切换至根目录 type = getFileType(client, dir); // 获取当前类型 if (type == 0) { // 文件 localPath = localDir + "/" + new File(dir).getName(); client.download(dir, new File(localPath)); } else if (type == 1) { // 目录 downloadFolder(client, getURL(dir), localDir); } } } finally { logout(client); } } /** * 下载文件夹 * * @param client * FTP客户端对象 * @param url * FTP URL * @param localDir * 本地存储目录 * @throws Exception */ private void downloadFolder(FTPClient client, URL url, String localDir) throws Exception { String path = url.getPath(); client.changeDirectory(path); // 在本地创建当前下载的文件夹 File folder = new File(localDir + "/" + new File(path).getName()); if (!folder.exists()) { folder.mkdirs(); } localDir = folder.getAbsolutePath(); FTPFile[] files = client.list(); String name = null; for (FTPFile file : files) { name = file.getName(); // 排除隐藏目录 if (".".equals(name) || "..".equals(name)) { continue; } if (file.getType() == FTPFile.TYPE_DIRECTORY) { // 递归下载子目录 downloadFolder(client, getURL(url, file.getName()), localDir); } else if (file.getType() == FTPFile.TYPE_FILE) { // 下载文件 client.download(name, new File(localDir + "/" + name)); } } client.changeDirectoryUp(); } /** * 获取目录下所有文件 * * @param dir * 目录 * @return * @throws Exception */ public String[] list(String dir) throws Exception { FTPClient client = null; try { client = getClient(); client.changeDirectory(dir); String[] values = client.listNames(); if (values != null) { // 将文件排序(忽略大小写) Arrays.sort(values, new Comparator<String>(){ public int compare(String val1, String val2) { return val1.compareToIgnoreCase(val2); } }); } return values; } catch(FTPException fe) { // 忽略文件夹不存在的情况 String mark = "code=550"; if (fe.toString().indexOf(mark) == -1) { throw fe; } } finally { logout(client); } return new String[0]; } }
本文向大家介绍java编写ftp下载工具,包括了java编写ftp下载工具的使用技巧和注意事项,需要的朋友参考一下 需要用到 java 写一个 ftp 的工具,因为只有一点点 java 基础,但是由于好几年不用,几乎算是不会了,只好一点点来搞,还好能捡起来。 不过因为是在 Linux 下使用 javac 编译,不是在 WIN 下使用 IDE 来做这些事情,所以在运行和编译上又费了一些时间,不过正是
(商用请联系作者获取授权,个人用户无限制) 简介 FTP Manage Tools(FTP管理工具)是一个基于WEB的FTP客户端程序,你可以通过它对你的FTP文件进行管理。 程序采用AJAX,由PHP+JQuery/JavaScript完成。 你可以在http://119.29.112.32/ 进行体验。 包含功能 包括文件新建、上传、下载、复制、剪切、粘贴、删除、重命名,对Windows平台的
CodeIgniter的FTP类允许你将本地文件传输到远程服务器上,同时可以移动、重命名和删除远程服务器上的文件。这个FTP类所包含的一个"mirror"函数允许你通过FTP在远程服务器上创建一个本地文件夹的镜像。 注意: 不支持 SFTP 和 SSL FTP 协议, 仅支持标准 FTP 协议. 初始化类 像大多数其他CodeIgniter 类一样,FTP 类在控制器里使用$this->load-
CodeIgniter 的 FTP 类允许你传输文件到远程服务器,也可以对远程文件进行移动、重命名或删除操作。 FTP 类还提供了一个 "镜像" 功能,允许你将你本地的一个目录通过 FTP 整个的同步到远程服务器上。 注解 只支持标准的 FTP 协议,不支持 SFTP 和 SSL FTP 。 使用 FTP 类 初始化类 使用示例 类参考 使用 FTP 类 初始化类 正如 CodeIgniter 中
介绍 variety 是一个壁纸管理软件,支持自动切换壁纸,支持网络下载。 安装 直接在软件管理器中搜索 variety ,安装即可。 配置 和 linux mint 自带的壁纸管理相比,variety 支持多个文件夹,切换壁纸时随机在各个目录下的壁纸中选择。而默认的壁纸管理只能选择一个目录。 另外 variety 支持自动下载网络壁纸,只是质量没有保证,有些壁纸丑的吓人。网络下载这个功能不实用。
tags:截图 shutter 是 linux 下非常好用的一款截图软件,功能强大。 注: shutter是快门的意思。 安装 可以通过软件管理器直接安装,”开始菜单” -> “系统管理” -> “软件管理器”,搜索 shutter: 点击安装即可。 配套软件 需要安装几个配套的软件,才能使用 shutter 全面的功能: gnome-web-photo: a tool to generate f
安装 sudo apt-get install autojump 安装完成之后如果直接运行autojump,会报错如下: $ autojump Please source the correct autojump file in your shell's startup file. For more information, please reinstall autojump and read t
通过 SOFATracer 上下文获取 Span 在一次分布式链路调用过程中,在集成了 SOFATracer 的组件会产生一个 Span 并会缓存到 SOFATracer 的上下文中,这个上下文是缓存在 ThreadLocal 中的,作为使用者可以通过如下的方式随时获取到当前 SOFATracer 的上下文: SofaTraceContext sofaTraceContext = SofaTrac