首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Ruby“`remove”和“`remove!”删除文件

使用Ruby“`remove”和“`remove!”删除文件
EN

Stack Overflow用户
提问于 2015-08-21 23:45:00
回答 2查看 4.9K关注 0票数 2

我正在尝试使用Ruby从FTP删除文件,但我一直收到一个错误,说该文件不存在。

代码语言:javascript
复制
:error=>"Net::SFTP::StatusException (2, \"no such file\")"

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

代码语言:javascript
复制
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)。我在想,这可能是因为我需要更改工作目录,这显然是net/sftp不允许的。

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-07-27 18:40:07

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

我们确认了FTP上的权限没有改变,所以我认为使用non_interactive: true可能是个窍门。

代码语言:javascript
复制
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

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

票数 1
EN

Stack Overflow用户

发布于 2015-08-22 04:32:58

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

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32150796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档