Rubyでファイルを扱うまとめ

| コメント(0) | トラックバック(0)

Rubyのファイル操作に関するまとめメモ公開

# open options
   r       read only
   w       write only
   a       append only

   r       read write
   w       read write
   a       read write append

   b       binary mode
           例 a b

# File method
   read            読み込み全体
   readlines       読み込み 行
   foreach         読み込み 行
   each_byte       読み込み 1byte
   gets            読み込み行,順次ファイルポインタ移動

   wirte           書き込み 引数1のみ
   puts            書き込み 引数をそれぞれ改行表示
   putc            書き込み 1文字
    <<             書き込み 連結
   print           書き込み 引数は複数持ち連結
   printf          書き込み 書式付き

   dirname         ディレクトリ取得
   basename        ファイル名取得
   extname         拡張子
   expand_path     絶対パス取得
   split           ディレクトリとファイル名をlistで返す
   join            パスの結合


# FileUtils method

    cd(dir,opt)                   ディレクトリの変更
    pwd()                         現在のディレクトリを返す
    mkdir(dir|list,opt)           ディレクトリ作成
    mkdir_p(dir|list,opt)         サブディレクトリも作成
    rmdir(list,opt)               ディレクトリ削除
    ln(list,destdir,opt)          ハードリンク作成
    ln_s(list,dest,opt)           シンボリックリンク作成
    ln_sf(src,dest,opt)           上書き強制
    cp(src,dest,opt)              コピー
    cp_r(src,dest,opt)            サブディレクトリもコピー
    mv(src|list,dest,opt)         移動
    rm(list,opt)                  削除
    rm_f(list,opt)                強制削除
    rm_rf(list,opt)               ディレクトリも強制削除
    install(src,dest,opt)         src destが同一でなければコピー
    chmod(mode,list,opt)          権限変更
    chmod_R(mode,list,opt)        サブディレクトリも権限変更
    chown(user,group,list,opt)    所有権変更
    chown_R(user,group,list,opt)  サブディレクトリも所有権変更
    touch(list,opt)               最終更新時刻とアクセス時刻を変更


# Dir[] メタ文字

    *             全ての文字
    **/           サブディレクトリ対象
    ?             どれか1文字
    {a.txt,b.txt} a.txt or b.txt
    [0-9]         0-9のみ
    [^0-9]        0-9は除外


# File.fnmatch option

    File::FNM_NOESCAPE  \をエスケープしない
    File::PATHNAME      メタ文字が / にマッチしない
    File::FNM_CASEFOLD  大文字小文字を区別しない
    File::DOTMATCH      メタ文字が . にマッチする



# File.stat  method

    atime              最終アクセス時刻
    ctime              最終状態変更時刻
    mtime              最終更新時刻
    ftype              ファイルタイプ


    directory?         
    file?
    pipe?
    symlink?
    socket?
    blockdev?
    chardev?
    readable?          読み込み可能
    readable_real?     実ユーザー、実グループで読み込み可能
    writeable?         書き込み可能
    writeable_real?
    executable?        実行可能
    executable_real?
    zero?              sizeが0byte
    size?              file size
    size
    owned?
    grpowned?
    setuid?
    setgid?
    sticky?




# text.txt 中身
    a
    b
    c
    あ
    い
    う
    え
ruby
# 読込 #############################################
#

# ruby 1.8 1.9
p File.read("text.txt")
    #=> "a\nb\nc\nあ\nい\nう\nえ\nお\n"

p File.readlines("text.txt")
    #=> ["a\n", "b\n", "c\n", "あ\n", "い\n", "う\n", "え\n", "お\n"]

# ruby 1.9
# encoding指定
#
p File.read("sjis.txt",:encoding => "Shift_JIS:UTF-8")
    #=> "日本語はSJIS\n"

p File.read("euc.txt",:encoding => "EUC-JP:UTF-8")
    #=> "日本語はEUC-JP"

# block記述
#
p open("text.txt") {|f| f.read }
p open("text.txt") {|f| f.readlines }


# gets
#
open("text.txt") do |f|
  p f.gets  #=> "a\n"
  p f.gets  #=> "b\n"

  while line = f.gets
    puts "#{line}"
  end
end

# foreach
#
File.foreach("text.txt") do |line|
  puts "#{line}"
end
    #=> a
    #=> b
    #=> c
    #=> あ
    #=> い
    #=> う
    #=> え
    #=> お


# each_byte
#
open("text.txt") do |f|
  f.each_byte { |b| print b," "}
     #=> 97 10 98 10 99 10 227 129 130 10 227 129 132 10 227 129 134 10 227 129 136 10 227 129 138 10
  f.rewind #ファイルポインタを先頭する
end



# 書き込み ###########################################
#

open("test.txt","w ") do |f|
  f << "<"  << "=" << ">\n"     #連結
  f.write "write\n"             #引数1つのみ
  f.puts "puts","hoge"          #引数ごとに改行を入れる
  f.putc 97                     #文字コード出力  a
  f.print "p","r","i","n","t\n" #引数連結
  f.printf "%s \n",100          #書式付き

end

puts File.read("test.txt")
    #=> <=>
    #=> write
    #=> puts
    #=> hoge
    #=> aprint
    #=> 100 


# ファイルポインタ操作 #####################################
#
open("test.txt","w ") do |f|
  f.print "abcdefghijklmnopqrstuvwxyz"

  #pos ファイルポインタの位置取得
  p f.pos  #=> 26

  #pos ファイルポインタの位置設定
  f.pos = 10
  p f.pos  #=> 10

  #pos ファイルポインタの現在位置からの移動
  f.pos -= 5
  p f.pos  #=> 5

  #rewind ファイルポインタを先頭に
  f.rewind
  p f.pos  #=> 0

  #seek ファイルポインタの末尾から-1移動
  f.seek(-5,IO::SEEK_END)
  p f.pos  #=> 25

  #現在のファイルポインタの書き換え
  f.print "A"

end

p File.read("test.txt")
    #=> "abcdefghijklmnopqrstuAwxyz"



# ファイルのコピー、移動、削除
#

# fileutils ライブラリを利用、Unixコマンドとほぼ一緒
require "fileutils"


p FileUtils.pwd
    #=> "/home/mukaer/work/ruby"

FileUtils.cd('/') do |dir|
  p dir
end


# ファイル名を操作 ########################################
#

#ディレクトリ取得
p File.dirname "/etc/http/conf/httpd.conf"
    #=> "/etc/http/conf"

p File.dirname "text.txt"  #/がない場合
    #=> "."

p File.dirname "/etc/httpd/"
    #=> "/etc"

p File.dirname "/etc//httpd/"
    #=> "/etc"


#ファイル名取得
p File.basename "/etc/http/conf/httpd.conf"
    #=> "httpd.conf"

p File.basename "/etc/httpd/"
    #=> "httpd"

p File.basename "/etc//httpd/"
    #=> "httpd"

#拡張子 除外
p File.basename "/etc/http/conf/httpd.conf" ,".conf"
    #=> "httpd"

p File.basename "/etc/http/conf/httpd.conf" ,".*"
    #=> "httpd"

#拡張子取得
p File.extname "/etc/http/conf/httpd.conf" 
    #=> ".conf"

p File.extname ".emacs"  #拡張子外となる
    #=> ""

p File.extname ".vimrc"
    #=> ""

#ディレクトリとファイル名をlistで返す
p File.split "/etc/http/conf/httpd.conf" 
    #=> ["/etc/http/conf", "httpd.conf"]


#絶対パス取得
p File.expand_path "~/"
    #=> "/home/mukaer"

p File.expand_path "../"
    #=> "/home"

#パスの結合
p File.join "/usr","local","src"
    #=> "/usr/local/src"


# ワイルドカードででファイル名取得#################################
#


p Dir["/*"]
    #=> ["/sbin", "/root", "/opt", "/etc", "/mnt", "/lost found", "/selinux", "/proc", "/bin", "/sys", "/tmp", "/boot", "/srv", "/lib64", "/var", "/media", "/lib", "/dev", "/home", "/usr"]


#隠しファイル取得
p Dir[".*"]

#拡張子付きファイル取得
p Dir["*.*"]

#隠しファイルも含めたファイル
p Dir["*\0.*"]


# ワイルドカードにマッチするかチェック
p File.fnmatch "*.rb" ,"test.rb"
   #=> true


p File.fnmatch '\*', '*'                      #=> true
p File.fnmatch '\*', '*', File::FNM_NOESCAPE  #=> false


p Dir.glob('*.TXT',File::FNM_CASEFOLD)
     #=> ["text.txt", "test.txt", "sjis.txt", "euc.txt"]

Dir.glob('*.TXT',File::FNM_CASEFOLD) do |fname|
  p fname
end
    #=> "text.txt"
    #=> "test.txt"
    #=> "sjis.txt"
    #=> "euc.txt"



# ファイルの情報取得 ##############################################
#

# ファイルの存在
p File.exist? "text.txt"
    #=> true

# ファイルチェック
p File.file? "/"
    #=> false


# ファイル情報取得
s = File.stat "text.txt"



p s.atime
    #=> 2012-04-11 22:15:07  0900

関連記事

トラックバック(0)

トラックバックURL: http://mukaer.com/cgi-bin/mt/mt-tb.cgi/77

コメントする

PR

PR





検索

Loading

メニュー

twitter