基于命令行实现FTP上传下载

时间:2022-05-10 04:56:33

【摘要】常用的FTP工具大多基于交互界面,本文实现的是用C#基于命令行的FTP的上传下载。用命令行完成一个目录的上传下载,即能够双击或是一个快捷键就完成FTP的同步。

【关键词】FTP;命令行;上传;下载

一、解决思路

我们设计的是使用命令一键式完成目录上传下载,这样不仅可以直接使用命令行进行处理,也方便其他程序调用,而且FTP功能也是齐备的。三个主功能都与FTP相关,所以在使用时:

1.首先连接FTP;

2.取得FTP上的文件目录清单;

3.下载时将FTP上的文件同步到本地目录;

4.本地目录中已经存在,要查看在FTP上是否存在等等。

二、从FTP下载

由于我们需要跟踪整个过程,包括文件下载过程,因而我们要调用“wininet.dll”中的函数接口,这就需要把相应的FTP功能进行封装,全部存放到namespace MyProFTP中。并定义如Filetime,WIN32_FIND_DATA等一些结构数据结构。

使用以下命令:

MyFtp-down his3/his3@192.168.1. 127:21/9401 d:\down\0124

这是将FTP对应的9401目录下载到本地的d:\down\1024目录,先根据FTP目录拆分出相应的用户名、密码、FTP地址、端口和FTP上指定的目录。在使用FtpDll.fun_Connect建立FTP链接后,利用FTP.fun_ftpDirs()来遍历指定目录9401下所有子目录及文件。由于使用DLL调用FTP是单线程的,而目录及文件数的不确定,其中fun_Dir核心这样处理:

li_files=fun_FtpDirs(is_ftpRoot,true);

for(li=0;li

if(ftpfiles[li].bDir)fun_FtpDirs (ftpfiles[li].cPath+”/”+ftpfiles[li].cFile,false);

其中ftplies的定义是:List ftpfiles=new List( );

它用于存放FTP上取得的目录和文件清单。函数fu_FtpDirs(string strPath,boolean ab_Mode)是取得指定目录下的所有子目录和文件(不递归):

MyItem=new Itemftp( );

MyItem.cFile=myFileData.cFileName;

ftpfiles.Add(MyItem);

while(FtpDll.InternetFindNextFile(ul_find,myFileData))

{

MyItem=new Itemftp();

MyItem.cFile=myFileData.cFileName;

ftpfiles.Add(MyItem);

}

InternetCloseHandle(ul_find);

return ftpfiles.Count;

上述代码完成对指定FTP目录下查找文件和目录(部分),还加入:

MyItem.bDir=((myFileData.dwFileAttri-butes&16)= =16);

其中List就是要重点介绍的仿真动态数组,它和Array有相似之处,但区别在于,定义时不需要确定长度,可动态扩展。在访问时(读)又和数组的使用相同。

在已经有列表之后,有进度条显示的FTP下载也基本完成了:

li_countfiles=MyFtp.fun_FtpDirs( );

pb_info.Maximum=li_countfiles;

pb_info.Step=1;

for(li_which=0;li_which

{

MyFtp.fun_downfile(li_which,”/9401”, strLoc)

}

最后只要把单个文件下载处理一下,利用流文件的读取并利用FtpOpenFile、InternetRead-File,并单文件下载完成后用InternetClose-Handle关闭进程即可。为保证文件的正确性,使用BINARY流格式。

三、上传至FTP

和下载相比,似乎还要容易实现一些。上传前,先完成本地指定目录的遍历,本地文件的遍历可以和FTP目录遍历的算法相同,具体可以参看Form_MyFTP.cs中fun_locfiles函数的实现。

然后和上传FTP相似,连接好FTP,将存放到Listlocfiles中的文件依次上传。函数FtpDll.fun_upfile的主要内容就是:

Is_ftpfile=Is_ftpfile.Replace(as_locpath,is_ftpRoot);

Is_ftpfile=Is_ftpfile.Replace(“\\”, “/”);

if(ab_Dir){ //目录需要建立

FtpDll.FtpCreateDirectory(hInternetConnection,Is_ftpfile);

return true;

}

FtpDll.FtpPutFilehInternetConnection,as_file,Is_ftpfile,…BINARY,0);

由于FTP的目录没有办法检测是否存在,所以上传一个目录,只要在FTP上建立目录,如果检测通常只能这样:

if(FtpDll.FtpCreateDirectory(hInternetConnection,as_dir return!FtpDll.FtpRemoveDirectory(hInternetConnection,as_dir);

return true;

也就是所建立一下目录,如果成功,则删除目录,并返回false;否则返回true,所以我们上传时不需检测,只要建立FTP目录即可。

虽然上传、下载我们都已经完成了,但是如何提高性能、加强用户交互的可视性则是下一版本需要探讨的问题。

参考文献

[1]徐怀平.用C#定制实用的FTP工具[J].电脑编程技巧与维护,2013(01).

[2]赵洁.同步FTP上载/下载程序的实现技术[J].电脑与信息技术,2002(01).

作者简介:李玮琦(1982—),女,四川大竹人,大学本科,工程硕士,达州职业技术学院助教,主要从事计算机及其应用教学研究。

上一篇:变幅应力作用下有限疲劳寿命的估算研究 下一篇:基于加权D—S证据理论与共轭梯度下降BP神经网...