时间: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—),女,四川大竹人,大学本科,工程硕士,达州职业技术学院助教,主要从事计算机及其应用教学研究。