我有这个代码从远程计算机下载文件,但我想将其限制为小于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
答案 0 :(得分:1)
如果我将它用于大文件,是否会导致任何问题?
我们不知道,因为我们不知道您的互联网连接有多快,您有多少内存,管道从您下载文件的主机的速度有多快?
基本上,你正在阅读文件两次,一次进入内存看它有多大,然后再次满足你的要求,这似乎真的......傻。
您正在将正在读取的主机和网络连接的流量增加一倍,并且,如果文件大于本地计算机上的RAM,则会变得疯狂。
正如Darshan所说,看看使用Net :: SFTP。它将使您能够在尝试加载文件之前查询文件的大小,而不会将整个文件拉下来。使用起来有点复杂,但这种复杂性转化为灵活性。
“/用户/ MYNAME /文件名”
(S)FTP可能不一定有它可以看到该文件的基本路径。要探测系统并弄清楚,请通过SFTP连接询问系统首次登录时当前目录是什么,然后使用Net :: STFP docs中的此示例询问它可以看到的文件:< / p>
sftp.dir.glob("/base/path", "*/**/*.rb") do |entry| p entry.name end
这将以递归方式查看"/base/path"
层次结构,搜索所有“* .rb”文件。
答案 1 :(得分:0)
您当前的代码下载文件,检查下载文件的大小(可能是为了检查它是否小于5MB,但实际上并没有这样做),然后再次下载。即使你使用fsize
做了一些事情,也没有下载它。为时已晚。
我会研究sftp gem而不是scp;使用sftp做你想做的事情应该非常简单,但不能用scp。