2015-08-21 9 views
1

Я пытаюсь удалить старые файлы с FTP с помощью Ruby net/sftp, но я продолжаю получать сообщение о том, что файл не существует.Удалите файл с помощью Ruby SFTP `remove` и` remove! `

: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 не разрешает.

Заранее благодарен!

+1

«Я думал, возможно, это было потому, что мне нужно было сменить рабочий каталог, который, по-видимому, net/sftp не позволяет». На SFTP-протоколе фактически нет команды для изменения удаленного каталога. Клиенты с операцией cd/chdir притворяются. – Kenster

ответ

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 

Я до сих пор не в полной мере понять, почему же метод не работал раньше, но мы можем удалить файлы во вложенных папках тоже, как показано в этом примере.

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

Спасибо за помощь, но ни один из вариантов, которые я пытаюсь удалить, - это каталоги. – theUtherSide