使用Ruby SFTP`remove`和`remove!`删除文件

时间:2015-08-21 23:45:00

标签: ruby ftp sftp delete-file net-sftp

我正在尝试使用Ruby $.post从FTP中删除文件,但我一直收到一条错误信息,说文件不存在。

net/sftp

我可以使用相同的信用卡登录时手动删除文件,所以我知道我有权限。

:error=>"Net::SFTP::StatusException (2, \"no such file\")"

我更喜欢require 'net/sftp' ftp = Net::SFTP.start(@ftp_url, @ftp_user, :password => @ftp_pwd) ftp.dir.entries('somePath').each do |entry| begin age_days = (Time.now.to_i - entry.attributes.atime) / 86400 if(age_days > ftp_max_file_age_days) ftp.remove!(entry.name) end rescue Exception => e # log error here end end 所以在这种情况下一切都会同步发生,但我也尝试了remove!

我还尝试为其提供文件的完整路径,而不仅仅是条目名称(例如remove而不仅仅是'somePath' + entry.name)。我想也许是因为我需要更改工作目录,显然entry.name不允许。

提前致谢!

2 个答案:

答案 0 :(得分:1)

如果是,请检查entry是否为目录,然后使用ftp.rmdir。如下 -

require 'net/sftp'
ftp = Net::SFTP.start(@ftp_url, @ftp_user, :password =>  @ftp_pwd)
ftp.dir.entries('somePath').each do |entry|
  begin
    age_days = (Time.now.to_i - entry.attributes.atime) / 86400

    if(age_days > ftp_max_file_age_days)
      if File.directory?(entry.name)
        ftp.rmdir(entry.name) 
      else         
        ftp.remove!(entry.name)
      end
    end

  rescue Exception => e
    # log error here
  end
end

答案 1 :(得分:0)

我们最终能够使用remove方法(而不是remove!)删除文件。)我们对提供密码的方式做了一些小改动。

我们确认FTP上的权限没有改变,因此我认为使用non_interactive: true可能就是一招。

require 'net/sftp'

def self.delete_report(endpoint, username, password, report_filename)
  SSH_OPTIONS = { non_interactive: true }.freeze
  report_filename_base = File.basename(report_filename, '.*')

  Net::SFTP.start(endpoint, username, SSH_OPTIONS.merge(password: password)) do |sftp|
    sftp.remove(report_filename)
    sftp.remove("#{report_filename_base}.fin")
    sftp.remove("processed/#{report_filename}")
    sftp.remove("processed/#{report_filename_base}.fin")
    sftp.remove("failed/#{report_filename}")
    sftp.remove("failed/#{report_filename_base}.fin")
    sftp.remove("failed/#{report_filename_base}.info")
  end

我仍然不完全理解为什么同样的方法以前不起作用,但我们也能够删除子文件夹中的文件,如本例所示。