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 を使用していました。私はダウンロードを2回行っていることを知っています:(

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 の容量、ファイルをダウンロードしているホストからのパイプの速度がわからないため、わかりません。

ただし、基本的には、ファイルを 2 回読み込んでいます。1 回目はファイルの大きさを確認するためにメモリに読み込み、次に要件を満たしているかどうかを確認します。これは本当にばかげているように思えます。

ネットワーク接続から読み込んでいるホストへのトラフィックが 2 倍になり、ファイルがローカル マシンの RAM よりも大きい場合は、おかしくなってしまいます。

Darshan が言うように、Net::SFTP の使用を検討してください。ファイルをロードする前に、ファイル全体を引き下げることなく、ファイルのサイズを照会することができます。使い方は少し複雑ですが、その複雑さが柔軟性につながります。


「/ユーザー/私の名前/ファイル名」

(S)FTP には、そのファイルを参照できるベース パスがあるとは限りません。システムを調べて把握するには、SFTP 接続を介して、最初にログインしたときに現在のディレクトリが何であるかをシステムに尋ねます。次に、Net::STFP ドキュメントの次の例のようなものを使用して、システムが表示できるファイルを尋ねます。

sftp.dir.glob("/base/path", "*/**/*.rb") do |entry|
  p entry.name
終わり

"/base/path"これは、すべての「*.rb」ファイルを検索して、階層を再帰的に調べます。

于 2013-04-26T23:14:49.627 に答える
0

現在のコードはファイルをダウンロードし、ダウンロードしたファイルのサイズをチェックして (おそらく 5MB 未満かどうかをチェックしますが、実際にはそうしません)、再度ダウンロードします。で何かをしたとしてもfsize、ダウンロードしていないのでは遅すぎます。

scp ではなく sftp gem を調べます。sftp でやりたいことを行うのはかなり簡単ですが、scp ではできません。

于 2013-04-26T23:12:56.923 に答える