From: Uechi Yasumasa Date: 2000-06-22T13:49:04+09:00 Subject: [ruby-list:23452] ftp.rb $B$G(B resume ----Next_Part-31543_961649336_784 Content-Type: text/plain; charset=iso-2022-jp Content-Disposition: attachment; filename=".cur-nutmeg-31543-961649163" Content-Transfer-Encoding: 7bit ftp.rb で resume できるように考えてみましたが、どんなもんでしょう。 問題ないようでしたら取り込んでくださると嬉しいです :-) -- うえち uechi@ryucom.ne.jp http://www1.ryucom.ne.jp/uechi/ ----Next_Part-31543_961649336_784 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="ftp.rb.resume" Content-Transfer-Encoding: 7bit --- /usr/lib/ruby/1.4/net/ftp.rb Thu Apr 27 20:15:17 2000 +++ ftp.rb Thu Jun 15 16:27:43 2000 @@ -26,7 +26,7 @@ FTP_PORT = 21 CRLF = "\r\n" - attr_accessor :passive, :return_code, :debug_mode + attr_accessor :passive, :return_code, :debug_mode, :resume attr_reader :welcome, :lastresp def FTP.open(host, user = nil, passwd = nil, acct = nil) @@ -38,6 +38,7 @@ @passive = false @return_code = "\n" @debug_mode = false + @resume = false if host connect(host) if user @@ -188,16 +189,28 @@ end private :makepasv - def transfercmd(cmd) + def transfercmd(cmd, rest_offset = nil) if @passive host, port = makepasv conn = open_socket(host, port) + if @resume and rest_offset + resp = sendcmd("REST " + rest_offset.to_s) + if resp[0] != ?3 + raise FTPReplyError, resp + end + end resp = sendcmd(cmd) if resp[0] != ?1 raise FTPReplyError, resp end else sock = makeport + if @resume and rest_offset + resp = sendcmd("REST " + rest_offset.to_s) + if resp[0] != ?3 + raise FTPReplyError, resp + end + end resp = sendcmd(cmd) if resp[0] != ?1 raise FTPReplyError, resp @@ -245,10 +258,10 @@ @welcome = resp end - def retrbinary(cmd, blocksize, callback = Proc.new) + def retrbinary(cmd, blocksize, rest_offset = nil, callback = Proc.new) synchronize do voidcmd("TYPE I") - conn = transfercmd(cmd) + conn = transfercmd(cmd, rest_offset) loop do data = conn.read(blocksize) break if data == nil @@ -283,14 +296,14 @@ end end - def storbinary(cmd, file, blocksize, callback = nil) + def storbinary(cmd, file, blocksize, rest_offset = nil, callback = nil) if iterator? callback = Proc.new end use_callback = callback.is_a?(Proc) synchronize do voidcmd("TYPE I") - conn = transfercmd(cmd) + conn = transfercmd(cmd, rest_offset) loop do buf = file.read(blocksize) break if buf == nil @@ -329,10 +342,16 @@ callback = Proc.new end use_callback = callback.is_a?(Proc) - f = open(localfile, "w") + if @resume + rest_offset = File.size?(localfile) + f = open(localfile, "a") + else + rest_offset = nil + f = open(localfile, "w") + end begin f.binmode - retrbinary("RETR " + remotefile, blocksize) do |data| + retrbinary("RETR " + remotefile, blocksize, rest_offset) do |data| f.write(data) callback.call(data) if use_callback end @@ -363,10 +382,15 @@ callback = Proc.new end use_callback = callback.is_a?(Proc) + if @resume + rest_offset = size(remotefile) + else + rest_offset = nil + end f = open(localfile) begin f.binmode - storbinary("STOR " + remotefile, f, blocksize) do |data| + storbinary("STOR " + remotefile, f, blocksize, rest_offset) do |data| callback.call(data) if use_callback end ensure ----Next_Part-31543_961649336_784