FtpList: An application to list all files and directories in a FTP server or a local computer. The result can be a tree or a URL list.

作者：马健
邮箱：stronghorse@163.net
主页：http://stronghorse.yeah.net

FAQ
使用说明
附录A 鸣谢
附录B 版本更新记录

## FAQ

Q：FtpList是什么？
A：这是一个目录列表工具，能够列出FTP、本地磁盘上的目录内容，输出格式可以是树型图，也可以是URL、HTML、带格式文本文件等形式。

Q：FtpList有什么用？
A：对于喜欢下载的人来说，如果某些FTP比较难连，可以用FtpList整理出这些FTP服务器的URL列表，然后把URL粘贴到FlashGet等下载工具中，这样就可以用比普通FTP工具更可靠、更执着的专业下载工具，一天24小时不停地进行重试，直到下载到为止。
对于FTP站点管理员或普通用户来说，可以用FtpList生成本地目录的树型图，便于管理、宣传。

Q：FtpList有什么特点？
A：FtpList具有以下特点：

1. 采用底层FTP协议，发送一次LIST -R命令即可获得指定目录及其下所有子目录（包括隐含子目录）的全部信息，中间的所有目录切换工作由FTP服务器本身完成，大大减少了传输交互过程。
2. 如果FTP服务器软件不支持LIST -R命令，也可以由FtpList自己逐级周游服务器目录。这种方式与前一种方式相比，对服务器资源占用略小，但是通讯过程大大麻烦，速度也比前一种慢。
3. 可选是否采用PASV模式。
4. 支持站点记忆，即如果需要经常访问某些站点，可以把站点的host/port、username/password存储起来，以后用的时候调入即可，省去输入的烦恼。
5. 可以列本地磁盘中的内容。
6. 输出格式可选，可以直接输出URL列表，也可以输出树型图，输出树型图时还可以选择是否输出文件长度等信息。

Q：FtpList有哪些限制？
A：FtpList不是万能的，存在以下限制：

1. FtpList没有自动重连的功能。如果站点较大、内容较多，列表需要的时间可能会很长，这会增加链接丢失的机会。因此在这种情况下，建议一次只列出FTP上的一个主目录，多列几次还是可以得到整个站点的信息的。
2. 为了加快显示树型图、URL列表的速度，显示前会在系统临时目录下生成临时文件，显示完成后自动删除。因此请保证系统盘有足够的剩余空间。

Q：为什么有些FTP的文件列不出来，或者只能列第一级目录？有什么解决方法？
A：可能的原因有两个：

1. 最常见原因是FTP服务器不支持PASV方式，解决的办法很简单：清除PASV选项即可。
2. 也有可能是FTP服务器不支持LIST -R命令，把“Use LIST -R command”选项清掉就可以了。

Q：为什么在有些机器上中文文件名、目录会显示成乱码？
A：在某些版本的Windows 9x下，由于DLL的问题，在FtpList的显示窗口中可能会出现中文显示不正确的问题。这个时候不要管它，直接存盘，然后用记事本（Notepad）、Word打开保存的文件就可以了。存盘的文件不会出现乱码。

Q：我需要为使用、转载FtpList付费吗？
A：FtpList是一个“友情软件”（Friendware），用户在承诺不用于商业目的，也不对文件及其附件进行任何更改的条件下，不需要为使用该软件负任何费用，最多是在动漫讨论区看到我发帖子灌水时，进去捧个人场，作为友情回报，或者在年节时发个email问声好（所以叫“友情软件”）。我承诺绝不在程序中暗藏任何商业广告、木马，但不承诺为使用FtpList的后果承担任何责任。如果您需要将它用于商业目的，或加入您的网站，请与我联系，否则保留追究一切责任的权利。

## 使用说明

一、获取FTP文件列表

在“FTP Server”框中，输入Host（服务器地址）、Port（端口）、User（用户名）、Password（密码）、Remote path（FTP上的起始目录），确定是否采用PASV方式。如果有防火墙（firewall），再点框中的“Firewall”按钮，在弹出的对话框中对防火墙进行设置。如果需要经常访问此站点，可以点框中的“Save”按钮保存，以后用的时候点“Load”按钮即可再调入。

“FTP Server”框中内容设置完成后，点外面的“Go”按钮即可开始获取目录信息。获取过程的中间信息会显示在窗口下方的信息框中。数据传输完成后，系统自动对收到的信息进行解释，然后显示出目录的树型结构。

如果不幸说明也没列出来，把PASV选项去掉试试。如果不幸目录只列出了一层，那么恭喜，您中奖了：对方服务器不支持LIST -R命令。这时可以将“Use LIST -R command”选项去掉，再点Go，就可以列出下级目录了。这种强迫方式的数据通讯量比用LIST -R命令要大得多，在网络拥堵的时候可能会列不全，因此建议只有在确信服务器不支持LIST -R命令时才用。

如果希望在输出的树型图中只列出目录结构，而不包含目录中的文件，可以在“Output”框中清除“Show files”选项，然后点“Tree”按钮。如果希望在树型图中使用英文字符而不是中文字符，可以清除“Use Chinese character”选项，然后点“Tree”按钮。如果希望树型图中只包含文件名和目录名，不包括长度信息，可以清除“Verbose mode”选项，然后点“Tree”按钮。

如果希望输出FTP的URL列表，以便粘贴到FlashGet等下载工具中，可以点击“Output”框中的“URL”按钮。如果希望在URL中直接包含用户名和密码，可以在选中“With user and password”选项后再点“URL”按钮。如果在树图中看到某些目录下面没有列出文件，可以清除“Show files”选项，列出所有目录，然后再对怀疑列不全的目录重新列表。

如果希望得到HTML格式的输出，便于从中选择需要的链接，直接用鼠标拖到FlashGet上下载，则可以点击“Output”框中的“HTML”按钮。

如果希望将FTP上的文件列表导入数据库或Excel工作表，可以点击“Output”框中的“List”按钮，输出的结果是一个用制表符（\t）分割的文本文件，第一列是目录，第二列是文件名，第三列是文件大小。

如果希望保存输出结果，点“Save”按钮，在弹出的对话框中选择目标文件即可。

二、获取本地目录列表

点击“Local”按钮，在弹出的对话框中选择需要列出的目录即可。对输出结果的处理同前。

## 附录A 鸣谢

本程序的FTP通讯部分参考了Phil Anderson在codeguru上发表的A simple FTP client class。

## 附录B 版本更新记录

Version 1.14
新增功能：在列表区增加右键菜单，方便需要进行复制操作的用户。

Version 1.13
1、新增功能：HTML格式输出。输出结果是一个HTML文件，并且在输出后自动调用IE打开这个文件，需要下载其中的哪个链接直接用鼠标拖到FlashGet即可。适用于需要从站点文件中选择下载的情况。
2、新增功能：LIST方式输出。这种输出的结果是一个用制表符（\t）分割的文本文件，第一列是目录，第二列是文件名，第三列是文件大小。这种格式的文件适于导入数据库或Excel工作表。

Version 1.12
新增功能：在列URL的时候，增加“Show files”选项。这个选项缺省是选中的，如果在树图中看到某些目录下面没有列出文件，可以清除这个选项，列出所有目录，然后再对怀疑列不全的目录重新列表。
功能改进：在列目录的过程中，允许中断。
功能改进：改写了Phil Anderson在codeguru上发表的A simple FTP client class，将基于CSocket、CAsyncSocket的CFTPClient类，改写成基于纯socket函数、无阻塞的类，在此基础上实现了用LIST -R命令时的中断功能。原先用MFC的CFtpConnection类写的不用LIST -R命令列表的代码也被彻底放弃，统一到新类上来。套句IT流行语：“俺终于也掌握‘黑心’技术咧！”
功能改进：临时文件不再使用C盘根目录下固定的文件，而是在系统临时目录中创建，这样就取消了一次只能运行一个FtpList的限制。
功能改进：输出结果大于10MB时，改为直接存盘，不再在信息显示窗口中显示，以免浪费时间和内存。
功能改进：以前在滚动窗口中显示收到的所有信息，这些信息也是需要内存来存储的。现在改为只显示收到的最新信息，以减少无谓的内存消耗。
错误修正：点Local按钮列本地目录，或不用LIST -R列FTP目录的时候，最上层目录的长度总计不正确。

Version 1.10a
新增功能：如果“Verbose mode”选项被选中（缺省为选中），在输出目录项的时候，除了输出该目录下的子目录数、文件数、文件长度外，还输出此目录下所有各级子目录中的文件长度之和。这个功能将有助于了解FTP或本地硬盘中占据资源最多的目录，也可用于清点FTP或硬盘中的收藏数量。

Version 1.10
新增功能：增加“Use LIST -R command”选项。如果此选项被选中（缺省为选中），则FtpList将使用高效、可靠的LIST -R命令获取服务器目录信息。但是LIST -R命令并不是所有服务器都支持的，在不支持的服务器上用LIST -R命令只能返回第一级目录。这时就可以清除这个选项，强制FtpList逐级周游服务器目录，以获取完整目录结构。

Version 1.09
新增功能：增加“Verbose mode”选项。如果此选项被选中（缺省为选中），则在输出树型图的时候，在目录项后面会附加目录下的子目录数、文件数、文件总长度，在文件后面会附加文件长度。

Version 1.08
功能修正：目录、文件按照字母顺序排列。

Version 1.07
新增功能：用户可以选择是否采用PASV方式。
新增功能：将Go按钮设置为缺省按钮，即按回车键相当于点击Go按钮。
错误修正：在数据包边界部分，可能会因半个汉字而造成乱码。
错误修正：如果Remote Path不为空，该子目录下的文件和目录会被重复列出。
错误修正：某些包含特定字符的目录列不出来。

Version 1.06
功能增强：某些FTP服务器在返回目录信息的时候，可能会漏掉目录下的子目录信息，这时FtpList可以根据后面的信息重建目录树。

Version 1.05
anonymous首字母改成小写，与某些FTP服务器兼容。

Version 1.04
错误修正：非标准端口号在URL输出时位置不正确。

Version 1.03
错误修正：在选择“With user and password”后点URL，输出结果中的协议名称错误，并且不包含非标准端口号。

Version 1.02
1、修正Version 1.01的存盘错误。
2、采用中间文件进行过渡，加快显示速度。

Version 1.01
重新定义了部分数据结构及算法，减少内存消耗。

Version 1.00
能够列出FTP、本地目录的树型图、URL列表。