aws sdk rubyでファイルの存在チェックをしようとしています。
list_objectsでディレクトリの中にあるファイルの一覧を取得しFile.exist?で該当のファイルがあったら削除そうでないならexitというものを作りたいのですがFile.exist?がうまくいかず該当のファイルが見つかりませんとなります。どう修正すればよろしいでしょうか。
ruby
1require 'aws-sdk-core' 2require 'aws-sdk' 3require 'json' 4require "digest/md5" 5 6def test_bucket 7$s3 = Aws::S3::Client.new( 8 :region => 'ap-northeast-1', 9 :access_key_id => '*************', 10 :secret_access_key => '**********************************', 11 ) 12end 13 14# 正常終了すれば true が返る 15def delete_file(object_name, target_file) 16 ARGV.each_with_index do |arg, i| 17 puts "ARGV[#{i}]:#{arg}" 18 end 19 20 $siteid = ARGV[0] 21 $contentsid = ARGV[1] 22 $filename = ARGV[2] 23 24 unless $siteid =~ /[^\w]/ 25 puts "ok" 26 else 27 puts "ng" 28 exit 29 end 30 31 unless $contentsid =~ /[^\d]/ 32 puts "ok!" 33 else 34 puts "ng!" 35 exit 36 end 37 38 unless $filename =~ /[^\w.]/ 39 puts "ok!!" 40 else 41 puts "ng!!" 42 exit 43 end 44 45 46# puts $siteid 47# puts $contentsid 48# puts $filename 49 50 $contentsfolder = (($contentsid.to_i / 100).floor + 1)*100 51 52# puts $contentsfolder 53 54 $contentsfolder2 = $contentsid+(Digest::MD5.hexdigest($contentsid + "scdci" + $siteid )[0...10]) 55 56# puts $contentsfolder2 57 58 59# test_bucket.delete_object({ 60# bucket: "aizawatest", 61# key: "apfiles/#{$siteid}/contents/#{$contentsfolder}/#{$contentsfolder2}/#{$filename}/", 62# }) 63#end 64 65 test_bucket.list_objects(:bucket => 'test' , 66 :prefix => "apfiles/#{$siteid}/contents/#{$contentsfolder}/#{$contentsfolder2}").contents.each do |object| 67 #puts "#{object.key} => #{object.etag}" 68 puts File.basename("#{object.key}") 69 70 if File.exist?("apfiles/#{$siteid}/contents/#{$contentsfolder}/#{$contentsfolder2}/#{$filename}") 71 # ファイルがある場合 72 puts "ファイル" + $filename + "が存在します" 73 else 74 # ファイルがない場合 75 puts "ファイル" + $filename + "が存在しません" 76 exit 77 end 78 79 end 80 81 82 test_bucket.delete_object({ 83 bucket: "test", 84 key: "apfiles/#{$siteid}/contents/#{$contentsfolder}/#{$contentsfolder2}/#{$filename}", 85 }) 86end 87 88 89 90 91 92if delete_file('delete_file', 'delete_file') # => true/false 93 puts '削除完了' 94else 95 puts '削除失敗' 96end 97 98 99#end
変数名の先頭に「$」を付けると、グローバル変数としてどこからでも参照・更新できるようになります。しかし、可読性を著しく下げる原因にもなります。可能であればグローバル変数を使用しないコードを提示していただけますでしょうか