FTPリスト

30分プログラム、その85。FTPのファイル一覧を取得するプログラム。

  1. FTPサーバにいっぱいファイルがあるなぁ
  2. どれが更新されたか分りづらいなぁ
  3. 更新情報を自動生成したら、おもしろいかな
  4. ファイルリストを生成して、diffでいいな

という動機。本当に稼動するかどうかは、管理者な人々と相談してからだけどね。

あと、うちの不安定な無線LAN回線の状況を反映して、簡易ながらレジューム機能もついてる。

#!/opt/local/bin/ruby -w

require 'net/ftp'
require 'kconv'

RESUME = 'ftp_list.resume'
queue = []
result  = []
if File.exist?(RESUME)
  STDERR.puts "resumed"
  File.open(RESUME){|io|
    queue,result = Marshal.load io.read
  }
end

ftp = Net::FTP.new(*ARGV)

queue += ftp.nlst

begin
  until queue.empty? do
    dirname = queue.shift
    dirname_jp = dirname.toutf8
    list = ftp.nlst dirname

    STDERR.puts "Process...: #{dirname_jp}"
    if list == [dirname] then
      STDERR.puts "Get File: #{dirname_jp}"
      result << dirname_jp
    else
      STDERR.puts "Add Queue: #{list[0..3].inspect}"
      queue += list
    end
  end
  File.open('ftp_list.out','w'){io.puts result.join("\n")}
  puts result.join("\n")
  File.delete RESUME
rescue SignalException,StandardError => e
  STDERR.puts "FAILURE!!"
  STDERR.puts e.inspect
  File.open(RESUME,'w+'){|io|
    io.print Marshal.dump([queue,result])
  }
end
  • 幅優先探索。特に理由はない。ただキューを使うようにしたら、勝手にそうなった
  • 始めはmapと再帰で書いていたけど、それだとレジュームが難しいのであきらめた
  • ちょっと動作があやしいかも