使用 Ruby SFTP `remove` 和 `remove!` 删除文件
Delete a file using Ruby SFTP `remove` and `remove!`
我正在尝试使用 Ruby net/sftp
从 FTP 中旧删除文件,但我一直收到错误消息说该文件不存在。
: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
)。我在想也许是因为我需要更改工作目录,这显然 net/sftp
不允许。
提前致谢!
检查 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
我们最终能够使用 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
我仍然不完全理解为什么以前同样的方法不起作用,但我们也可以删除子文件夹中的文件,如本例所示。
我正在尝试使用 Ruby net/sftp
从 FTP 中旧删除文件,但我一直收到错误消息说该文件不存在。
: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
)。我在想也许是因为我需要更改工作目录,这显然 net/sftp
不允许。
提前致谢!
检查 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
我们最终能够使用 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
我仍然不完全理解为什么以前同样的方法不起作用,但我们也可以删除子文件夹中的文件,如本例所示。