0

そこで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が、実際には手がかりがありません。

4

1 に答える 1

3

問題は、誰があなたに言っているのです?Invalid commandか?

この場合、それはサーバーではなく FTPクライアントです。

クライアントは、実装するコマンドの単なるフロントエンドであり、これらのフロントエンド コマンドをサーバーの適切な FTP プロトコル コマンド文字列に変換します。

探しているのは、 FTP プロトコル コマンドをサーバーに発行するクライアントのnlist(not ) コマンドです。nlstNLST

ftp> help nlst
?Invalid help command nlst
ftp> help nlist
nlist           nlist contents of remote directory
ftp>
于 2012-07-04T12:08:14.917 に答える