所以我正在阅读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
但我真的不知道。