`
xnnyygn
  • 浏览: 44118 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论

尝试使用edtftpj遍历FTP服务器上的列表

阅读更多
edtFTPj提供了一个简易的构建FTP客户端的方法集合。现在的需求是遍历FTP服务器上的文件,获取文件信息,主要是文件名和文件大小。

一般的想法是使用递归方法遍历。因为文件系统是类似普通树的结构,存在自相似性。不过这样的潜在问题是占用太多内存,每个函数压栈,保存了许多用不到的信息——对于每次函数获取的信息来说,只需要得到文件夹的名字(和当前目录字符串合并可以得到完整的路径),而不需要获得其他信息,所以决定使用stack和循环来模拟这个递归过程。

stack貌似java.util.stack这个类,不过貌似其超类vector名声不怎么好(可能是占用系统空间比较大等原因),java.util.stack成为了一个遗留类。所以需要重新写一个用array或者linkedlist来实现的stack类。

下面采用linkedlist类来实现stack,(模仿stack中的代码写的)。

package com.hako.ftp;

import java.util.LinkedList;
import java.util.EmptyStackException;

/**
 * 
 * @author XnnYygn
 * 
 * @param <E>
 */
public class ListStack<E> extends LinkedList<E> {
	/**
	 * create empty stack
	 */
	public ListStack() {

	}

	/**
	 * Tests if this stack is empty
	 * 
	 * @return <code>true</code> if and only if this stack contains no items;
	 *         <code>false</code> otherwise.
	 */
	public boolean empty() {
		return size() == 0;
	}

	/**
	 * append item to the stack
	 * 
	 * @param item
	 *            E
	 */
	public void push(E item) {
		add(item);
	}

	/**
	 * return the item from the stack and remove it
	 * 
	 * @return the item
	 */
	public E pop() {
		E obj = null;
		obj = peek();
		removeLast();
		return obj;
	}

	/**
	 * return the item from the stack without removing it
	 * 
	 * @return the item
	 */
	public E peek() {
		if (size() > 0)
			return getLast();
		else
			throw new EmptyStackException();
	}

	/**
	 * search the item in the stack
	 * 
	 * @param o
	 * @return the index of item
	 */
	public int search(Object o) {
		int i = lastIndexOf(o);
		if (i >= 0) {
			return size() - i;
		}
		return -1;
	}

	/** the generated serialVersionUID */
	private static final long serialVersionUID = -1560355629647329776L;

}



使用这个stack来保存的主要是压栈的工作目录,其基本工作思路如下:

  • 获取当前目录下的所有目录,当前目录下的文件全部输出
  • 如果栈非空,切换当前目录到出栈的目录,继续上面的过程


代码如下,具体测试FTP服务器和用户名密码等信息没有列出。
package com.hako.ftp;

import java.io.IOException;
import java.text.ParseException;

import com.enterprisedt.net.ftp.FTPConnectMode;
import com.enterprisedt.net.ftp.FTPException;
import com.enterprisedt.net.ftp.FTPFile;
import com.enterprisedt.net.ftp.FileTransferClient;

public class FtpList {
	// the ftp
	private FileTransferClient ftp = null;
	// the stack of task
	private ListStack<String> stack = null;
	// the count of item
	private Integer count = 0;

	public FtpList() throws FTPException, IOException, ParseException {
		// prepare
		ftp = new FileTransferClient();
		ftp.setRemoteHost("");//host
		ftp.setUserName("");//username
		ftp.setPassword("");//password
		ftp.getAdvancedSettings().setControlEncoding("GBK");
		ftp.getAdvancedFTPSettings().setConnectMode(FTPConnectMode.PASV);

	}// end of HakoFtpList

	public void connect() throws IOException, FTPException {
		// connect
		ftp.connect();
		System.out
				.println("Connect successfully!");

	}// end of Connect

	public void disconnect() throws IOException, FTPException {
		// disconnect
		if (ftp.isConnected()) {
			ftp.disconnect();
			System.out
					.println("Disconnect successfully");
		}

	}// end of Disconnect

	public void getAllFileList() throws FTPException, IOException,
			ParseException {
		// get file from root
		getAllFileList("");
	}// end of getAllFileList

	public void getAllFileList(String rootPath) throws FTPException,
			IOException, ParseException {
		// init stack and count
		stack = new ListStack<String>();
		count = 0;
		// get file list under root
		getFileList(rootPath);

		// with stack
		while (!stack.isEmpty()) {
			getFileList(stack.pop());
		}

	}// end of getAllFileList(rootPath)

	private void getFileList(String path) throws FTPException, IOException,
			ParseException {
		// check the path
		if (path == null) {
			return;
		} else if (path == "") {
			// get directory for ftp
			ftp.changeDirectory("/");
		} else {
			// get directory for test
			ftp.changeDirectory(path);
		}

		// get file list
		FTPFile[] files = ftp.directoryList();

		for (FTPFile file : files) {
			if (file.isDir()) {
				// System.out.println(path + "/" + file.getName());

				stack.push(path + "/" + file.getName());
			} else {
				System.out.println(path + "/" + file.getName());
				count++;
				// System.out.println("Size " + file.size());
			}
		}
	}// end of getFileList
}



至此,可以遍历得到FTP下面的目录列表。

需要修改的地方:
  • 保存到文件
  • 多一个线程察看进度



实际调用代码如下:
			FtpList ftplist= new FtpList();
			ftplist.connect();
			ftplist.getAllFileList();
			ftplist.disconnect();

记得捕捉错误
1
0
分享到:
评论

相关推荐

    C#实现,遍历ftp上的文件夹,文件名

    本篇文章将深入探讨如何使用C#实现遍历FTP服务器上的文件夹和文件名。 首先,要实现FTP功能,你需要引入`System.Net`命名空间中的`FtpWebRequest`和`FtpWebResponse`类。这两个类提供了与FTP服务器交互的基础接口。...

    VC++ 遍历FTP文件目录

    3. **发送FTP命令**:在Socket连接上,我们可以使用`send`函数发送FTP命令,然后使用`recv`函数接收服务器的响应。 4. **解析FTP响应**:FTP服务器会返回文件列表信息,这通常是一个格式化的文本,包含每个文件或...

    MFC控制台的FTP递归遍历程序

    在本程序中,我们使用了FTP的LIST命令来获取服务器目录结构,并通过解析返回的列表信息来构建递归遍历的逻辑。 MFC的CInternetSession类提供了对FTP服务的基础支持,包括连接、断开、登录等操作。接着,...

    ftp下载文件C++列表显示遍历ftp目录

    当我们谈论“ftp下载文件C++列表显示遍历ftp目录”时,我们实际上是在讨论如何使用C++编程语言实现一个FTP客户端,该客户端能够连接到FTP服务器,列出其目录内容,并将这些文件下载到本地计算机。下面,我们将深入...

    使用QT实现文件上传和下载----ftp服务器

    在本文中,我们将深入探讨如何使用QT库来实现文件的上传和下载功能,特别是与FTP服务器的交互。QT是一个跨平台的应用程序开发框架,广泛应用于C++编程,它提供了丰富的功能,包括网络通信,使得我们可以方便地构建...

    CFtpFileFindftp实现FTP文件遍历

    在C++编程环境中,当你需要实现远程FTP(文件传输协议)服务器上的文件遍历功能时,`CFtpFileFindftp`类是MFC(Microsoft Foundation Classes)库提供的一种实用工具。这个类允许开发者搜索FTP服务器上的文件和目录...

    使用CFtpFileFind和递归算法来遍历ftp目录

    在Windows编程中,Microsoft提供了一些类库来简化FTP操作,其中`CFtpFileFind`是一个重要的工具,它可以帮助我们高效地遍历FTP服务器上的目录结构。当涉及到处理大量数据或者深层次的目录结构时,递归算法就显得尤为...

    FTP遍历下载目录

    FTP(File Transfer Protocol)是一种广泛使用的互联网协议,用于在客户端和服务器之间进行文件传输。在C++编程环境中,我们可以利用FTP库,如libcurl或ftplib,来实现FTP遍历并下载目录的功能。这个功能在软件自动...

    递归遍历FTP文件夹

    递归遍历FTP文件夹,并从文件夹下载所有文件 希望对你有所帮助

    遍历FTP上的文件夹生成目录树

    实现了遍历FTP磁盘目录生成一个属性结构显示

    JAVA遍历下载FTPS服务器上的文件

    JAVA遍历下载FTPS服务器上的文件,

    c++实现ftp list所有文件与目录 & ftp down所有文件

    FTP是一种广泛使用的互联网协议,用于在服务器和客户端之间传输文件。下面将详细阐述实现这两个功能的关键步骤和涉及的技术。 首先,我们需要了解libcurl库。libcurl是一个开源、跨平台的库,它提供了在各种协议...

    VC遍历文件夹与文件

    本文将深入探讨如何使用C++在Visual C++(VC)中实现递归遍历指定文件夹及其子文件夹的所有文件,并构建一个树结构的表示。 首先,我们需要了解Windows API中的几个关键函数,它们是遍历文件系统的核心: 1. **...

    BrownFTPDir.rar_ftp_ftp遍历

    综上所述,"BrownFTPDir.rar_ftp_ftp遍历"涉及到的是使用FTP协议通过一个特定的工具或程序遍历并查看远程FTP服务器的目录结构。理解FTP的工作原理、安全性和操作方式对于网络文件管理和开发相关应用至关重要。

    JAVA获取FTP文件列表

    删除FTP上的文件及目录是另一个常见的需求。可以通过发送`DELE`或`RMD`命令来实现这一功能。 ##### 4. 关闭连接 在完成所有操作后,应该关闭与FTP服务器的连接。这可以通过调用`ftpClient.close()`来实现,以释放...

    MFC库console程序 递归遍历FTP下的所有文件

    调用MFC库的console程序,VC2010下编译与...测试所用的FTP服务器是本地服务器,基于windows8.1系统自带服务直接创建,详情请百度"win8.1创建FTP”,因此FTP的IP为"127.0.0.1",默认端口21. ITread类为调试用,请无视。

    FtpListV1.14汉化绿色版目录列表工具文件夹树状列表生成工具(支持ftp目录)

    对于喜欢下载的人来说,如果某些FTP比较难连,可以用FtpList整理出这些FTP服务器的URL列表,然后把URL粘贴到FlashGet等下载工具中,这样就可以用比普通FTP工具更可靠、更执着的专业下载工具,一天24小时不停地进行...

    Java解析FTP服务器文本文件

    Java解析FTP服务器文本文件是指使用Java语言连接FTP服务器,上传、下载、递归目录遍历等基本操作的集合。在这个过程中,我们需要引入相关的jar包,例如cpdetector.jar、jchardet-1.0.jar、antlr.jar、commons-...

    java实现本地按照FTP服务器上目录结构创建文件夹下载文件

    在Java编程环境中,实现从FTP(File Transfer Protocol)服务器上按照其目录结构创建本地文件夹并下载文件是一项常见的任务。FTP是一种用于在网络上传输文件的标准协议,它允许用户从远程服务器上获取或发送文件。本...

Global site tag (gtag.js) - Google Analytics