_...@163.com wrote:
Thank you. You are right, retrbinary did not notice I want to abort,
so it won't break the recv loop and close data connection....
    def getpart(self, ftp_filename, rest, cnt, out_filename):
        self.outf = open(out_filename, 'wb')
        self.cnt = cnt
        self.handle.voidcmd('TYPE I')
        conn = self.handle.transfercmd('RETR ' + ftp_filename, rest)
        while 1:
            data = conn.recv(8192)
            if not data:
                break
            if self.getpart_callback(data):
                try:
                    self.handle.abort()
                    break
                except:
                    pass
        self.outf.close()
        self.handle.voidresp()
        conn.close()

How about:
     import logging
     ...

     def getpart(self, ftp_filename, rest, cnt, out_filename):
         with open(out_filename, 'wb') as outf:
             self.outf = outf
             self.cnt = cnt
             self.handle.voidcmd('TYPE I')
             conn = self.handle.transfercmd('RETR ' + ftp_filename,
                                            rest)
             data = conn.recv(8192)
             while data:
                 if self.getpart_callback(data):
                     try:
                         self.handle.abort()
                         break
                     except BaseException, why:
                         # "except BaseException as why:" if >= Py2.6
                         logging.error('%s: %s encountered' % (
                                       (why.__class__.__name__, why))
                         if not isinstance(why, Exception):
                             raise
                 data = conn.recv(8192)
         self.handle.voidresp()
         conn.close()

--Scott David Daniels
scott.dani...@acm.org

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to