goo blog サービス終了のお知らせ 

コード溜め

備忘録的コンピュータ日記

[Ruby]ファイル処理の基本など

2011-01-09 23:41:43 | Ruby

基本パタン

open(fname , "r"){  |io|

  while line = io.gets

    chomp

    #.... 一行毎の処理など

  end

}

とか

open("index.html") {|f|  f.each {|line| print line}}など特定の行を読むopen(fname) {|io|  print io.readlines[99]}全部読みこんじゃうf = open(fname)print f.readf.close

[Ruby]暗号ツールEDで復号化を支援するスクリプト

2010-06-04 06:36:28 | Ruby
暗号化ツールED(http://type74.org/ed.php)にはコマンドラインから操作ができる機能があって、それを使って復号化を支援するコードを書いた。

E_D.exeをd:\Program Files\ED フォルダにいれてから
ruby -Ks 当スクリプト 復号化したいENCファイル.enc
 として使う バッチファイルにしてもよい。

ENCファイル名に10.06.10みたいに日付が入っていると、配列passrules
に入っているパスワードルールを順次試してくれる。
パスワードルールが適用できないと、コマンドプロンプトでパスワードを聞いてくる。


--ed_decode.rb
class SearchDate
 def SearchDate.get(str)
  date = Array.new
  date[0]=''
  if str =~ /20(\d\d)[\.\-](\d\d)[\.\-](\d\d)/ then
    date= [$1,$2,$3]
  else if str =~ /(\d\d)(\d\d)(\d\d)/ then
    date=  [$1,$2,$3]
  end
  date
 end
end

class RubyDecode

 def initialize (file = "")
  @file = file
  @target = @file
  @target= @target.sub(/.enc$/,'')
 
  @ruby_exec = "d:\\program files\\ed\\e_d.exe"
  @decodeline=@ruby_exec+" -D -F -P "
 end

 def getpass
  print "Input password and Press Enter key:"
  @password = $stdin.gets
  @password.chomp!
 end
 
 def decode
   @decodeline=@ruby_exec+" -D -F -P "

  @decodeline << @password
  @decodeline << " \""
  @decodeline << @file
  @decodeline << "\""
  print "Exec: "
  p @decodeline
  system(@decodeline)
 end
 
 def chk_success
  File.file?(@target)
 end
 
 def setpass(str="")
  @password = str
 end
end

#パスワードのルールを入れる%sの部分にそれぞれYYMMDDが収まる
passrules = ["XXXXX\%s\%s\%s",
           "ZZZZZ\%s\%s\%s"]

obj = RubyDecode.new(ARGV[0])

unless ARGV[0] =~ /^.*(.enc)$/ then
 print "Specify enc file\n"
 exit
end

date = SearchDate.get(ARGV[0])
unless date[0] == '' then
  automode = 1
  p "automode"
else
  automode = 0
  obj.getpass
end
 
if automode== 1 then
  passrules.each{|rule|
   pass = sprintf(rule,date[0],date[1],date[2])
   p pass
   
   obj.setpass(pass)
   obj.decode
   if obj.chk_success then
     p "Success\n"
     exit
   end
  }
  obj.getpass
end

obj.decode
if obj.chk_success then
  print "success\n"
  exit
else
  print "Failed. Check Password and Retry!\n"
end
end

Rubyでディレクトリのファイルサイズを計算

2009-12-18 00:09:49 | Ruby
rubyで初めてまともなスクリプトを書いてみた。フォルダを再帰的にトラバース(走査)して、各フォルダのファイルの合計サイズを表示する。

これ手始めに会社の共有ディスクの容量管理をしようと思っていたのだけど、どうも漢字コードにRubyは弱いのか、Windowsの日本語ファイルをいろいろ読んでいると半角カナファイル名がうまく扱えない模様。

ディレクトリのファイルリストを取り出したり、ファイルのサイズを調べたり、クラス定義したり、例外処理使ったりと結構いろいろやってみた。

class DirSize
 attr_accessor :size

 def initialize(dir=Dir.pwd)
     #諸変数の初期化
     @dir = dir;
     @size = 0;
    @ArrSubDir = []
   
   
    #サイズ計算
     chk_size;
 end
 
 def chk_size
   dir = Dir.open(@dir)
   tmpArdir = dir.entries
   dir.close
  
   tmpArdir.each{ |file|
       if FileTest.file?(@dir+"\\"+file) then
        @size += FileTest.size(@dir+"\\"+file)
       else
        next if file == "."
        next if file == ".."
        @ArrSubDir.push( DirSize.new(@dir+"\\"+file) )
      @size += @ArrSubDir.last.size
     end
     }
 end
 protected :chk_size
 
 def result
  @ArrSubDir.each{ |dir|
   dir.result
  }
  printf "%12d, %s\n",@size,@dir
 end
 public :result
 
end

#メインルーチン

begin
 a = DirSize.new(ARGV[0])
rescue => ex
 print ex.message,ex.backtrace,"\n"
 exit
end

#これで最後
a.result


下記の本だけで作りました。
たのしいRuby 第2版 Rubyではじめる気軽なプログラミング
高橋 征義,後藤 裕蔵
ソフトバンククリエイティブ

このアイテムの詳細を見る