Ruby 有没有更好的方法在下载前使用SCP检查文件大小?

Ruby 有没有更好的方法在下载前使用SCP检查文件大小?,ruby,scp,net-sftp,Ruby,Scp,Net Sftp,我有这个代码从远程机器下载一个文件,但我想把它限制在5MB以下的文件 到目前为止,代码仍然有效。但是有没有更好的方法在下载之前检查文件大小 Net::SCP.start(hname, uname, :password => pw ) do|scp| fsize=scp.download!("#{remdir}/#{filname}").size;puts fsize scp.download!("#{remdir}/#{filname}", "#{filname}") do |ch,

我有这个代码从远程机器下载一个文件,但我想把它限制在5MB以下的文件

到目前为止,代码仍然有效。但是有没有更好的方法在下载之前检查文件大小

Net::SCP.start(hname, uname, :password => pw ) do|scp|
fsize=scp.download!("#{remdir}/#{filname}").size;puts fsize
  scp.download!("#{remdir}/#{filname}",  "#{filname}") do |ch, name, sent, total|
  File.open(lfile, 'a'){ |f| f.puts "#{name}: #{(sent.to_f * 100 / total.to_f).to_i}% complete"}
  #puts "Sending : #{(sent.to_f * 100 / total.to_f).to_i}% complete"
  #puts "#{name}: #{sent}/#{total}"
  #print "\r#{name}: #{(sent.to_f * 100 / total.to_f).to_i}%"
  end
end
如果我将其用于大文件,是否会导致任何问题

fsize=scp.download!("#{remdir}/#{filname}").size;puts fsize
此页面表示文件将作为字符串返回:

更新: 我也试过SFTP。首先,它不适用于文件的完整路径。第二,它没有做我想要的。使用scp.download也是如此!()尺寸。我知道我下载了两次:(

更新:2个解决方案 在搜索网络后,使用下面用户提供的评论找到解决方案

    Net::SFTP.start(hname, uname, :password => pw) do |sftp| #, :verbose => Logger::DEBUG
        sftp.dir.glob("./#{remdir}", "#{filname}") do |entry| p entry.name
        file_size=entry.attributes.size;   file_size = '%.2f' % (("#{file_size}").to_f / 2**20)    ;  File.open(lfile, 'a'){ |f| f.puts "File size is #{file_size} mb"}
            if file_size < file_size_param then
                sftp.download!("#{remdir}/#{filname}", filname)
            else
            File.open(lfile, 'a'){ |f| f.puts "File size is greater than #{file_size_param} mb. so can not Download File"}
            end
        end
    end

您当前的代码将下载该文件,检查下载文件的大小(可能是为了检查文件是否小于5MB,但实际上您并没有这样做),然后再次下载。即使您使用
fsize
做了一些事情,也太晚了,无法下载它

我会研究sftp gem而不是scp;用sftp做你想做的事情应该很简单,但用scp不行

如果我将其用于大文件,是否会导致任何问题

fsize=scp.download!("#{remdir}/#{filname}").size;puts fsize
我们不知道,因为我们不知道你的互联网连接有多快,你有多少内存,你下载文件的主机的管道有多快

不过基本上,你要读两次这个文件,一次是进入内存,看看它有多大,然后再看看它是否符合你的要求,这看起来真的很…愚蠢

您正在将从网络连接上读取的主机的流量加倍,并且,如果该文件大于本地计算机上的RAM,那么它将崩溃

正如Darshan所说,看看如何使用Net::SFTP。它将使您能够在尝试加载文件之前查询文件大小,而不必将整个文件拖下来。它的使用有点复杂,但这种复杂性转化为灵活性


“/user/myname/filename”

(S) FTP可能不一定有可以看到该文件的基本路径。要探测系统并找出答案,请在您首次登录时通过SFTP连接向系统询问其当前目录,然后使用Net::STFP docs中的类似示例向系统询问可以看到的文件:

sftp.dir.glob("/base/path", "*/**/*.rb") do |entry| p entry.name end sftp.dir.glob(“/base/path”,“*/***/.rb”)do |条目| p entry.name 结束
它将递归地查看
“/base/path”
层次结构,搜索所有“*.rb”文件。

我也厌倦了SFTP。但它不起作用。更新了我上面的评论。如何在ruby@Darshani中获得SFTP中的文件大小,并使用文件名。但是上传不起作用,即使我需要推送的文件不存在于远程服务器上。上传是什么意思?你的代码和问题,不要在al提到上传L sftp.dir.glob("/base/path", "*/**/*.rb") do |entry| p entry.name end