2

我有这段代码可以从远程机器下载文件,但我想将其限制为小于 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

这个页面说文件将作为字符串返回: http ://ruby.about.com/od/ssh/ss/netscp_6.htm

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

require 'net/sftp'
# did not take full path "/user/myname/filename"
remote_path="somefile.txt"
 Net::SFTP.start(hname, uname, :password => pw) do |sftp|
   attrs = sftp.stat!("rome_desc.txt") ; puts attrs  # gave   #   ☼     ↨?%  (?  '→  ??Q{ ?Qt;?
     sftp.stat!(remote_path) do |response| puts response   #returned no such file (2)
 # but did not do below upload operation.
      unless response.ok?
    sftp.upload!("#{filname}", remdir)
  end
end
end

更新: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

使用 .attributes.size 获取文件大小并通过检查文件大小执行下载操作。

 sftp.dir.glob("./#{remdir}", "#{filname}") do |entry| p entry.name
        file_size=entry.attributes.size
4

2 回答 2

2

如果我将它用于大文件,这会导致任何问题吗?

我们不知道,因为我们不知道您的互联网连接速度有多快,您有多少 RAM,管道从您下载文件的主机有多快?

基本上,您要读取文件两次,一次进入内存以查看它有多大,然后再次读取它是否满足您的要求,这看起来真的......很傻。

你正在从你的网络连接上读取的主机的流量增加一倍,如果文件大于本地机器上的 RAM,它就会发疯。

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


“/用户/我的名字/文件名”

(S)FTP 可能不一定有它可以看到该文件的基本路径。要探测系统并弄清楚,通过 SFTP 连接询问系统,当您第一次登录时,它的当前目录是什么,然后使用 Net::STFP 文档中的以下示例询问它可以看到的文件:

sftp.dir.glob("/base/path", "*/**/*.rb") 做 |entry|
  p entry.name
结尾

这将递归地查看"/base/path"层次结构,搜索所有“*.rb”文件。

于 2013-04-26T23:14:49.627 回答
0

您当前的代码下载文件,检查下载文件的大小(大概是检查它是否小于 5MB,但您实际上并没有这样做),然后再次下载。即使你用 做了什么fsize,现在还没有下载它已经太晚了。

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

于 2013-04-26T23:12:56.923 回答