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上的文件,还是比较麻烦的。我还没有找出好的办法。