【问题标题】:Ruby Net::FTP gettextfile not able to save files locallyRuby Net::FTP gettextfile 无法在本地保存文件
【发布时间】:2012-06-23 10:12:59
【问题描述】:

我正在尝试从 ftp 站点检索文件 (.csv) 并将它们全部保存在本地同一文件夹中。我的代码如下所示:

#! /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'

按照建议,这里是 puts file 和 puts 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 或我的脚本中进行哪些更改以正确保存文件的任何建议?

【问题讨论】:

  • 您至少需要从修复您正在下载的文件开始。应该是ftp.gettextfile("#{file}","#{new_file}")。您不能将 new_file 作为源名称。
  • 感谢您的建议。我进行了更改并得到了与上面的第一条错误消息相同的错误。任何其他建议。
  • ftp.gettextfile(file, "testfile") 怎么样。您还应该在使用之前调试(打印出)new_file 是什么。
  • @Casper 我对我的问题进行了一些编辑,并尝试了您建议的方向。但是,我收到“没有这样的文件或目录”错误。我认为这与文件名中的额外空格有关,这就是我删除它们并创建一个新变量的原因。我将这些变量的实际值添加到我的问题中。

标签: ruby net-ftp


【解决方案1】:

当您只需要目录中的文件列表时,您应该使用nlst 而不是list。否则list 的输出需要正确解析。

当您请求文件时,它必须是原始文件名,包括所有空格。当您保存文件时,它可以是您想要的任何内容(包括空格或不包括空格)。错误是因为您请求了错误的文件。在您的情况下使用nlst。它会更容易(无需转换或解析)。

【讨论】:

  • 这看起来像是返回了一个好的文件名。然而 。和 .. 文件无法由 gettextfile 处理。如何从返回的嵌套数组中消除它们?
  • @analyticsPierce - 有很多方法。您可以将其添加到循环的第一行,例如:next if file.match(/^\.\.?$/)。如果文件是...,这将导致循环跳转到下一个元素。或者,如果您喜欢更详细的代码,那么:next if file == "." || file == "..".
  • 不错,完美。非常感谢您的帮助,我从中学到了很多。
猜你喜欢
  • 2012-03-17
  • 2014-07-02
  • 1970-01-01
  • 1970-01-01
  • 2019-01-23
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多