Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Ruby: Общие вопросы > Работа с ftp


Автор: Akeem 16.7.2006, 14:07
Вот такая задача: 
Нужно получить с фтп листинг фалов определённого вида( например: MOD17A2.A2006041.h33v10.004.2006065184018.hdf). Мне это не понятно как зделать. составить рег выражение такого вида могу, но  это только для стрингов будет работать.

Также: Как зделать чтобы переходить из папки в папку. Папки находятся в виде даты (например: 2000.06.19)? 
 плиз помогите.  

Автор: Rubynovich 17.7.2006, 13:53
Начнем с простого... для того, чтобы получить файл (с заранее известным адресом) можно использовать тот же open-uri.

Код

require 'open-uri'
url = 'ftp://localhost/test.txt'

open(url).read.display( File.open(File.basename(url),'w+') )


Но это только на чтение и для заранее определенных имен файлов. Поэтому нужно работать со специализированной библиотекой net/ftp.

Код

require 'net/ftp'
require 'pp'

Net::FTP.open('localhost'){ |ftp|
   ftp.login
   files = ftp.list('*').find_all{ |str| str[/^-/] }.map{ |str| str.split(/\s+/).last }
   pp files
   dirs = ftp.list('*').find_all{ |str| str[/^d/] }.map{ |str| str.split(/\s+/).last }
   pp dirs
}


Можно переходить в директории методом .chdir, но лучше использовать .list с указанием директории.

Код

    ftp.list('2000.12.12/*')


Стандартных регулярок здесь нет, но в примере я использовал несколько... для распознавания файл/директория и разбиения. Ты тоже можешь так делать. Регулярное выражение для твоих директорий будет выглядеть примерно так:
Код

   dirs = ftp.list('*').find_all{ |str| 
       [/\d{4}\.\d{2}\.\d{2}$/,/^d/].all?{ |rule| str[rule] } 
   }.map{ |str| str.split(/\s+/).last }
   pp dirs


С файлами проще... сворее всего их можно отсекать по расширению:
Код

   files = ftp.list('2000.12.12/*.hdf').find_all{ |str| str[/^-/] }.map{ |str| str.split(/\s+/).last }
   pp files


Метод pp я использовал для отладки. Можешь выкинуть все pp и reqiure 'pp' после того, как все заработает. 

Автор: Akeem 24.7.2006, 17:39
Спасибо. вопрос решен. Правда не так как рекомендовал Rubynovich, но немного ефктивнее дя программы. 

Автор: Rubynovich 24.7.2006, 21:22
Цитата(Akeem @ 24.7.2006,  17:39)
Спасибо. вопрос решен. Правда не так как рекомендовал Rubynovich, но немного ефктивнее дя программы.

Ну уж расскажи как решал... =) Для справки =) 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)