W
_wdx
Hi,
I write the following script to retrieve a part of a large file
from a FTP site:
import ftplib
class ftp_getter(object):
def __init__(self):
self.handle = ftplib.FTP('ftp_server_address')
self.handle.set_debuglevel(2)
self.login()
def login(self):
self.handle.login('user', 'pass')
self.handle.cwd('/temp1/')
def quit(self, is_close = False):
self.handle.quit()
if is_close:
self.handle.close()
print 'ftp handle closed'
def getpart_callback(self, received):
print "received a packet"
if self.cnt <= 0:
if not self.outf.closed:
self.outf.close()
if not self.aborted:
try:
self.handle.abort()
self.aborted = True
except Exception,ex:
pass
else:
print 'received packet, [0] = %x' % ord(received[0])
self.outf.write(received)
self.cnt -= len(received)
def getpart(self, ftp_filename, rest, cnt, out_filename):
self.outf = open(out_filename, 'wb')
self.cnt = cnt
self.aborted = False
self.handle.retrbinary('RETR ' + ftp_filename,
self.getpart_callback, 8192, rest)
if not self.outf.closed:
self.outf.close()
if __name__ == '__main__':
g = ftp_getter()
g.getpart('FILE_TO_RETRIEVE.DAT', 50000, 20, 'out.dat')
g.quit(True)
print "all done."
As the last four lines shown, I want to connect to my FTP server,
retrieve 20 bytes starting at offset 50000 from FILE_TO_RETRIEVE.DAT,
and stop retrieving after more than 20 bytes have been received. It's
quite simple, but to my suprise, this code does not work.
"self.handle.abort()" have been executed and I got the expected
response from server(426), but the RETR command does not seem to stop
at all. More and more data are received and getpart_callback method is
called again and again.
Why the RETR command is not actually aborted? Can anyone help me?
Thanks
Xu Wang
I write the following script to retrieve a part of a large file
from a FTP site:
import ftplib
class ftp_getter(object):
def __init__(self):
self.handle = ftplib.FTP('ftp_server_address')
self.handle.set_debuglevel(2)
self.login()
def login(self):
self.handle.login('user', 'pass')
self.handle.cwd('/temp1/')
def quit(self, is_close = False):
self.handle.quit()
if is_close:
self.handle.close()
print 'ftp handle closed'
def getpart_callback(self, received):
print "received a packet"
if self.cnt <= 0:
if not self.outf.closed:
self.outf.close()
if not self.aborted:
try:
self.handle.abort()
self.aborted = True
except Exception,ex:
pass
else:
print 'received packet, [0] = %x' % ord(received[0])
self.outf.write(received)
self.cnt -= len(received)
def getpart(self, ftp_filename, rest, cnt, out_filename):
self.outf = open(out_filename, 'wb')
self.cnt = cnt
self.aborted = False
self.handle.retrbinary('RETR ' + ftp_filename,
self.getpart_callback, 8192, rest)
if not self.outf.closed:
self.outf.close()
if __name__ == '__main__':
g = ftp_getter()
g.getpart('FILE_TO_RETRIEVE.DAT', 50000, 20, 'out.dat')
g.quit(True)
print "all done."
As the last four lines shown, I want to connect to my FTP server,
retrieve 20 bytes starting at offset 50000 from FILE_TO_RETRIEVE.DAT,
and stop retrieving after more than 20 bytes have been received. It's
quite simple, but to my suprise, this code does not work.
"self.handle.abort()" have been executed and I got the expected
response from server(426), but the RETR command does not seem to stop
at all. More and more data are received and getpart_callback method is
called again and again.
Why the RETR command is not actually aborted? Can anyone help me?
Thanks
Xu Wang