原文发表于:
http://www.blogjava.net/qixiangnj/archive/2006/11/19/82071.html
百度空间上的背景音乐时不时会更新下,每次都是通过FlashFXP上传的。又是登录,又是选择目录的,着实麻烦。于是写了这个小工具。
开发环境:Eclipse3.2+Pydev+Python2.4
技术上,没有太多的新意,几乎就是ftplib的基础应用。在开发方式上,通过写“死”的测试Demo,抽取出“活”的部分。整个迭代过程,比较自然。思路会随着写的过程,逐渐清晰。一些在设计之初没考虑到的细节部分,也会中途逐渐显现。
主要功能有三个。list,显示ftp站点某目录的内容;download,下载文件到指定目录下;upload,上传文件到指定目录下。
还是看代码,比较简单。一定程度上,考虑到了程序的可扩展性。
conf/config.xml:
1 <? xml version="1.0" encoding="UTF-8" ?>
2 < configuration >
3 < host > 10.0.0.1 </ host >
4 < user > username </ user >
5 < password > password </ password >
6 </ configuration >
modules/parseConf.py:
1 # Programmer: qixiang
2 # E-mail: mail2qixiang AT gmail DOT com
3 #
4 # Copyleft 2006 qixiang
5 #
6 # modules/parseConf.py 2006-11-19 03:56:15 qixiang
7
8 def getNodeValue(filename, nodename):
9 from xml.dom import minidom
10 xmldoc = minidom.parse(filename)
11 nodeValue = xmldoc.getElementsByTagName(nodename)[0].firstChild.data
12 return nodeValue
modules/handleFTP.py:
1 # Programmer: qixiang
2 # E-mail: mail2qixiang AT gmail DOT com
3 #
4 # Copyleft 2006 qixiang
5 #
6 # modules/handleFTP.py 2006-11-19 04:04:25 qixiang
7
8 from ftplib import FTP
9 def login(host, user, password):
10 try :
11 ftp = FTP(host)
12 # print 'connect successfully'
13 try :
14 ftp.login(user = user, passwd = password)
15 # print 'login successfully'
16 return ftp
17 except :
18 print ' incorrect user or password '
19 except :
20 print ' unconnected host '
21
22 def list(ftp, ftpDirectory):
23 try :
24 ftp.cwd(ftpDirectory)
25 ftp.retrlines( ' LIST ' )
26 ftp.close()
27 except :
28 print ' incorrect directory '
29
30 def upload(ftp, remoteFile, localFile):
31 try :
32 ftp.storlines( ' STOR ' + remoteFile, open(localFile))
33 print ' upload successfully '
34 print
35 ftp.retrlines( ' LIST ' )
36 ftp.close()
37 except :
38 print ' incorrect remoteFile or localFile '
39
40 def download(ftp, remoteFile, localFile):
41 try :
42 ftp.retrlines( ' RETR ' + remoteFile, open(localFile, " w " ).write)
43 print ' download successfully '
44 print
45 ftp.retrlines( ' LIST ' )
46 ftp.close()
47 except :
48 print ' incorrect remoteFile or localFile '
ftp.py :
1 # Programmer: qixiang
2 # E-mail: mail2qixiang AT gmail DOT com
3 #
4 # Copyleft 2006 qixiang
5 #
6 # ftp.py 2006-11-19 04:04:54 qixiang
7
8 import sys
9 from modules.parseConf import getNodeValue
10 from modules.handleFTP import login, list, upload, download
11
12 configFile = ' conf/config.xml '
13 flag = sys.argv[ 1 ]
14 ftp = login(getNodeValue(configFile, ' host ' ), getNodeValue(configFile, ' user ' ), getNodeValue(configFile, ' password ' ))
15
16 if flag == ' list ' :
17 list(ftp, sys.argv[ 2 ])
18 if flag == ' upload ' :
19 upload(ftp, sys.argv[ 2 ], sys.argv[ 3 ])
20 if flag == ' download ' :
21 download(ftp, sys.argv[ 2 ], sys.argv[ 3 ])
命令行下运行:
1. list
python ftp.py list ftp目录名
eg. python ftp.py list music
2. upload
python ftp.py upload 上传所要保存的ftp目录文件名 待上传的本地文件
eg. python ftp.py upload music\remote.xml c:\local.xml
3. download
python ftp.py download 待下载的远程文件 下载所要保存的本地目录文件名
eg. python ftp.py download music\remote.xml c:\local.xml
我个人是将实现upload功能的命令,保存成一个批处理文件。需要的时候,运行下就OK了。
upload.bat:
d:
cd java/eclipse/workspace/ftp
python ftp.py upload music\mp3player.xml f:\website\music\mp3player.xml
功能比较单一,还有许多欠考虑的地方。例如对上传文件类型的判断,对上传、下载文件所在目录存在与否的判断,等等。
小的东西,如果深究,也蛮有意思。
ps: 程序目录及copyleft部分借鉴了limodou的Ulipad,在此表感谢。