Ruby Net::FTP gettextfile не может сохранять файлы локально
Я пытаюсь получить файлы (.csv) с FTP-сайта и сохранить их все локально в одной папке. Мой код выглядит так:
#! /usr/bin/ruby
require 'logger'
require 'fileutils'
require 'net/ftp'
require 'rubygems'
require 'mysql2'
require 'roo'
require 'date'
# logging setup
log = Logger.new("/path_to_logs/ftp_log.log", 10, 1024000)
log.level = Logger::INFO
export_ftp_path = '/Receive/results/'
export_work_path ='/Users/pierce/results_exports/'
Net::FTP.open('host', 'username', 'password') do |ftp|
log.info("Logged into FTP")
ftp.passive = true
ftp.chdir("#{export_ftp_path}")
ftp.list.each do |file|
log.info("Found file #{file}")
new_file = file[56..115] #take part of the file name and remove spaces and periods
new_file = new_file.gsub(/[.]+/, "")
new_file = new_file.gsub(/\s/, "0")
ftp.gettextfile(file,"#{new_file}")
log.info("Downloaded file #{new_file}")
end
end
И вот ошибка, которую я получаю:
/Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:560:in `initialize': No such file or directory - (Errno::ENOENT)
from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:560:in `open'
from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:560:in `gettextfile'
from ftp_test.rb:44:in `block (2 levels) in <main>'
from ftp_test.rb:33:in `each'
from ftp_test.rb:33:in `block in <main>'
from /Users/pierce/.rbenv/versions/1.9.2-p290/lib/ruby/1.9.1/net/ftp.rb:116:in `open'
Как и было предложено, вот значения, которые я имею для файла put и put new_file.
file = -rwxr-xr-x 1 1130419 114727 9546 May 17 08:11 results_Wed. 16 May 2012.csv
new_file = results_Wed0230May02012csv
Любые предложения о том, что изменить в gettextfile или в моем скрипте, чтобы правильно сохранить файлы?
1 ответ
Вы должны использовать nlst
вместо list
когда вам просто нужен список файлов в каталоге. Выход из list
должен быть правильно проанализирован в противном случае.
Когда вы запрашиваете файл, это должно быть оригинальное имя файла, включая все пробелы. Когда вы сохраняете файл, он может быть чем угодно (включая пробелы или нет). Ошибка была в том, что вы запрашивали не тот файл. использование nlst
в твоем случае вместо. Это сделает это намного проще (не требуется преобразование или разбор).