そこでnlst
、NET::FTP モジュール (ruby-1.8.6) のメソッドのドキュメントを読んでいました。表示されるソースコードは
# File net/ftp.rb, line 602
def nlst(dir = nil)
cmd = "NLST"
if dir
cmd = cmd + " " + dir
end
files = []
retrlines(cmd) do |line|
files.push(line)
end
return files
end
したがって、コマンドは文字列に文字通り書き込まれ、cmd
経由で実行されretrlines
、ファイルのリストが正しく返されますか?
私が理解していないのは、私のWindows ftpサーバーにはそのようなコマンドがないということです:
230 User logged in.
Remote system type is Windows_NT.
ftp> nlst
?Invalid command
ftp>
それでも、メソッドはファイルリストを返します。それはどのように可能ですか?ソースコードには、コマンドにある種の抽象化がないように見えます。また、retrlines のソースコードには特別なものはありません (私にとって)。
# File lib/net/ftp.rb, line 475
def retrlines(cmd) # :yield: line
synchronize do
with_binary(false) do
conn = transfercmd(cmd)
loop do
line = conn.gets
break if line == nil
yield(line.sub(/\r?\n\z/, ""), !line.match(/\n\z/).nil?)
end
conn.close
voidresp
end
end
end
sendcmd
内部に呼び出されたメソッドをたどりましたtransfercmd
が、実際には手がかりがありません。