一个FTP小工具

一个FTP小工具

原文发表于: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,在此表感谢。
好。如果配置这块使用dict4ini就更方便了。
谢谢老大!
对配置文件读写这块,自己也在寻找比较轻量的解决方案,xml.dom略显笨重。
谢谢您的提醒,正在阅读Dict4Ini的资料。希望有愉快的体验!