FTP:用APPE(AppendFile)命令判断能否删除FTP上的文件
MFC Code:
需求:
我们有个程序,需要判断能否删除FTP上的指定文件。例如:假设FTP服务器是13.187.78.144,FTP虚拟目录是temp, temp下有个文件是a.txt,登录得用户名是dongdong,口令是dong.
办法:
我们的办法是用FTP的APPE来判断是否能修改a.txt,如果能修改的话,那么就能删除a.txt.
FTP没有返回关于a.txt能否被删除的信息。
一开始我们用FTP的重命名来把a.txt改名为其他名字(假设改为b.txt),如果修改成功,那么应该能删除a.txt.
但是,如果同时考虑IIS 5 和Linux下的VSFTPD,问题有点复杂了。
在IIS 5下面,如果a.txt的属性被设置成只读的,那么通过FTP的RNTO命令,你可以把a.txt随便改名成其它文件(例如b.txt),但是你不能通过FTP删除a.txt.
在VSFTPD下面,如果a.txt所在的目录temp的属性被设置成只读的,那么你是不能通过FTP的RNTO命令把a.txt改名的。通过FTP删除a.txt也会失败。如果a.txt所在的目录temp可以读写,那么不论a.txt是否可读写,你都可以重命名或者删除a.txt。
结论:
总之,用FTP的RNTO命令判断是否能删除a.txt会很狼狈,并且落个失败的下场。
问题1:使用APPE命令的时候要先判断a.txt是否已经存在。如果a.txt不存在,并且你有写的权限的话,你会在FTP上生成一个新的a.txt文件。
问题2:在发送APPE命令之前,必须发送PORT或PASV命令。
除了APPE(AppendFile)命令,不知道你还有其它方法吗?有的话,请联系我zhaowd2001@yahoo.com.
*****************************************测试报告***************************************
为了判断能否删除FTP上的文件,测试了不同的操作在Linux和Windows下的差别。
假设FTP上的文件名是 c.
rename to self :指用RNFR和RNTO命令,重命名一个文件到自身。执行RNFR c后立即执行 RNTO c
rename to tmp :指用RNFR和RNTO命令,重命名文件到其它文件。执行RNFR c后立即执行 RNTO c.tmp
PASV AppendFile:指用APPE命令,添加0个字节到文件。先执行PASV,然后执行APPE c命令。
linux vsFTPd :指使用linux下的vsFTPd服务器做为测试服务器。
windows 2000 iis :指使用windows 2000 iis 5做为FTP服务器。
linux 下的dire=r :表示目录权限用chmod a-w设置为只读。
linux 下的dire=rw:表示目录权限用chmod a+rw设置为可读写。
linux 下的file=rw:表示文件c的权限用chmod a+rw设置为可读写。
linux 下的file=r :表示文件c的权限用chmod a-w设置为只读。
windows下的dire right=r :表示给登录FTP的windows帐户赋予读FTP目录的权限。这和把目录的属性设置为read only不同。
windows下的dire right=rw:表示给登录FTP的windows帐户赋予读写FTP目录的权限。这和把目录的属性设置为read only不同。
windows下的file=normal :表示把文件c的属性设置为Normal.也就是普通文件。
windows下的file=readonly:表示把文件c的属性设置为只读。这和权限不同。
下表是各种情况的测试结果,T代表成功,F代表失败。
linux vsFTPd | windows 2000 iis 5 | |||||||||||
dire=r file=rw | dire=rw file=rw | dire=r file=r | dire=rw file=r | dire right=r file right=rw | dire right=r file right=r | dire right=rw file right=rw | dire right=rw file right=r | |||||
file = normal | file = readonly | file = normal | file = readonly | file = normal | file = readonly | file = normal | file = readonly | |||||
rename to self | T | T | T | T | F | F | F | T | T | T | T | |
rename to tmp | F | T | F | T | F | F | F | T | T | T | T | |
PASV AppendFile | T | T | F | F | T | F | F | T | F | F | F | |
delete | F | T | F | T | T | F | F | T | F | T | F |
从上表可以看出,即使同时使用rename to self、rename to tmp和PASV AppendFile三种操作,也不能唯一的确定delete成功或失败。看来,要判断能否成功删除FTP上的文件,还是比较麻烦的。我还没有找出好的办法。