2016-12-17 7 views
1

Использование Net::SFTP и dir Im пытается определить, какие записи являются файлами по каталогам. Не знаете, что посмотреть здесь:Как проверить, является ли запись файлом или каталогом с Net :: SFTP и Ruby

Net::SFTP.start(server_ip, ftp_username, :password => ftp_password, :port => ssh_port, :timeout => 6) do |sftp| 
     files = sftp.dir.entries(path).select{|entry| ??? } 
     directories = sftp.dir.entries(path).select{|entry| ??? } 
end 

ответ

1

Решение

Вы можете использовать:

files, directories = sftp.dir.entries(path).partition{ |entry| entry.file? } 

Пример

p files.map(&:name) 
# ["Gemfile", "Gemfile.lock", ".gitignore", "README.rdoc", "Rakefile", "sftp_pv.expect", "config.ru"] 
p directories.map(&:name) 
# ["data", "config", "..", "app", "tmp", "public", "vendor", "test", ".git", ".", "log", "bin", "lib", "db"] 

Как найти решение?

Я скопировал ваш код, определил все необходимые переменные для подключения к персональному серверу и определил path для удаленного проекта Rails.

Я изменил свой блок p sftp.dir.entries(path).first

Это вышло:

#<Net::SFTP::Protocol::V01::Name:0x00000000dbf3f8 @name="data", @longname="drwxr-xr-x 2 dev  dev   20480 Oct 27 10:45 data", @attributes=#<Net::SFTP::Protocol::V01::Attributes:0x00000000dbf5b0 @attributes={:size=>20480, :uid=>1002, :gid=>1003, :permissions=>16877, :atime=>1482015468, :mtime=>1477557907}>> 

погуглить Net::SFTP::Protocol::V01::Name Бро меня к documentation.

directory? и file? являются перспективными названиями!

Это:

p sftp.dir.entries(path).first.file?

вернулся false.

Наконец, я вспомнил, что с помощью reject и select с таким же блоком может быть сокращен с partition:

Возвращает два массива, первый содержащие элементы перечисления для которой блок истинно, в второй - остальное.