Ruby-ファイルI / O
Rubyは、カーネルモジュールに実装されたI / O関連のメソッドのセット全体を提供します。すべてのI / Oメソッドは、クラスIOから派生しています。
クラスIOは、のようなすべての基本的な方法を提供し、読み取り、書き込み、取得、プット、readlineの、getc関数、およびprintfのを。
この章では、Rubyで使用できるすべての基本的なI / O機能について説明します。その他の関数については、RubyクラスIOを参照してください。
プットステートメント
前の章では、変数に値を割り当ててから、putsステートメントを使用して出力を出力しました。
プットのステートメントは、変数に格納された値を表示するプログラムを指示します。これにより、書き込む各行の最後に新しい行が追加されます。
例
#!/usr/bin/ruby
val1 = "This is variable one"
val2 = "This is variable two"
puts val1
puts val2
これにより、次の結果が生成されます-
This is variable one
This is variable two
getステートメント
取得文がSTDINと呼ばれる標準画面からユーザからの入力を取るために使用することができます。
例
次のコードは、getsステートメントの使用方法を示しています。このコードは、ユーザーに値の入力を求めます。値は変数valに格納され、最終的にSTDOUTに出力されます。
#!/usr/bin/ruby
puts "Enter a value :"
val = gets
puts val
これにより、次の結果が生成されます-
Enter a value :
This is entered value
This is entered value
putcステートメント
文字列全体を画面に出力するputsステートメントとは異なり、putcステートメントを使用して一度に1文字を出力できます。
例
次のコードの出力は、文字H −だけです。
#!/usr/bin/ruby
str = "Hello Ruby!"
putc str
これにより、次の結果が生成されます-
H
印刷ステートメント
印刷ステートメントは、に似ているプットの声明。唯一の違いは、putsステートメントはコンテンツを印刷した後に次の行に移動するのに対し、printステートメントではカーソルが同じ行に配置されることです。
例
#!/usr/bin/ruby
print "Hello World"
print "Good Morning"
これにより、次の結果が生成されます-
Hello WorldGood Morning
ファイルを開いたり閉じたりする
これまで、標準入力と標準出力への読み取りと書き込みを行ってきました。次に、実際のデータファイルを操作する方法を説明します。
File.newメソッド
モード文字列に応じて、読み取り、書き込み、またはその両方にFile.newメソッドを使用してFileオブジェクトを作成できます。最後に、File.closeメソッドを使用してそのファイルを閉じることができます。
構文
aFile = File.new("filename", "mode")
# ... process the file
aFile.close
File.openメソッド
あなたは使用することができますFile.openの新しいファイルオブジェクトを作成し、ファイルにそのファイルオブジェクトを割り当てるための方法を。しかし、その間に1差があるFile.openとFile.new方法は。違いは、File.openメソッドをブロックに関連付けることができるのに対し、File.newメソッドを使用して同じことを行うことはできないことです。
File.open("filename", "mode") do |aFile|
# ... process the file
end
シニア番号 | モードと説明 |
---|---|
1 | r 読み取り専用モード。ファイルポインタはファイルの先頭に配置されます。これがデフォルトのモードです。 |
2 | r+ 読み取り/書き込みモード。ファイルポインタはファイルの先頭にあります。 |
3 | w 書き込み専用モード。ファイルが存在する場合、ファイルを上書きします。ファイルが存在しない場合は、書き込み用の新しいファイルを作成します。 |
4 | w+ 読み取り/書き込みモード。ファイルが存在する場合は、既存のファイルを上書きします。ファイルが存在しない場合は、読み取りおよび書き込み用の新しいファイルを作成します。 |
5 | a 書き込み専用モード。ファイルが存在する場合、ファイルポインタはファイルの最後にあります。つまり、ファイルは追加モードになっています。ファイルが存在しない場合は、書き込み用の新しいファイルが作成されます。 |
6 | a+ 読み取りおよび書き込みモード。ファイルが存在する場合、ファイルポインタはファイルの最後にあります。ファイルは追加モードで開きます。ファイルが存在しない場合は、読み取りと書き込み用の新しいファイルが作成されます。 |
ファイルの読み取りと書き込み
「単純な」I / Oに使用してきたのと同じメソッドが、すべてのファイルオブジェクトで使用できます。したがって、getsは標準入力から行を読み取り、aFile.getsはファイルオブジェクトaFileから行を読み取ります。
ただし、I / Oオブジェクトは、私たちの生活を楽にするための追加のアクセスメソッドのセットを提供します。
sysreadメソッド
メソッドsysreadを使用して、ファイルの内容を読み取ることができます。メソッドsysreadを使用すると、任意のモードでファイルを開くことができます。例-
以下は入力テキストファイルです-
This is a simple text file for testing purpose.
それでは、このファイルを読んでみましょう-
#!/usr/bin/ruby
aFile = File.new("input.txt", "r")
if aFile
content = aFile.sysread(20)
puts content
else
puts "Unable to open file!"
end
このステートメントは、ファイルの最初の20文字を出力します。これで、ファイルポインタがファイルの21番目の文字に配置されます。
syswriteメソッド
メソッドsyswriteを使用して、内容をファイルに書き込むことができます。メソッドsyswriteを使用する場合は、ファイルを書き込みモードで開く必要があります。例-
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
else
puts "Unable to open file!"
end
このステートメントは、「ABCDEF」をファイルに書き込みます。
each_byteメソッド
このメソッドは、クラスFileに属しています。メソッドeach_byteは、常にブロックに関連付けられています。次のコードサンプルを検討してください-
#!/usr/bin/ruby
aFile = File.new("input.txt", "r+")
if aFile
aFile.syswrite("ABCDEF")
aFile.each_byte {|ch| putc ch; putc ?. }
else
puts "Unable to open file!"
end
文字は変数chに1つずつ渡され、次のように画面に表示されます。
s. .a. .s.i.m.p.l.e. .t.e.x.t. .f.i.l.e. .f.o.r. .t.e.s.t.i.n.g. .p.u.r.p.o.s.e...
.
.
IO.readlinesメソッド
クラスFileは、クラスIOのサブクラスです。クラスIOには、ファイルの操作に使用できるいくつかのメソッドもあります。
IOクラスメソッドの1つはIO.readlinesです。このメソッドは、ファイルの内容を1行ずつ返します。次のコードは、メソッドIO.readlines −の使用法を示しています。
#!/usr/bin/ruby
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]
このコードでは、変数arrは配列です。input.txtファイルの各行は、配列arrの要素になります。したがって、arr [0]には最初の行が含まれ、arr [1]にはファイルの2番目の行が含まれます。
IO.foreachメソッド
このメソッドは、出力を1行ずつ返します。メソッドforeachとメソッドreadlinesの違いは、メソッドforeachがブロックに関連付けられていることです。しかし、メソッドとは異なりreadlines、メソッドのforeachは、配列を返しません。例-
#!/usr/bin/ruby
IO.foreach("input.txt"){|block| puts block}
このコードは、ファイルテストの内容を1行ずつ変数ブロックに渡し、出力が画面に表示されます。
ファイルの名前変更と削除
名前の変更と削除のメソッドを使用して、Rubyを使用してプログラムでファイルの名前を変更したり削除したりできます。
以下は、既存のファイルの名前を変更する例であるtest1.txtというの-
#!/usr/bin/ruby
# Rename a file from test1.txt to test2.txt
File.rename( "test1.txt", "test2.txt" )
以下は、既存のファイルを削除する例ですtest2.txtという名前を-
#!/usr/bin/ruby
# Delete file test2.txt
File.delete("test2.txt")
ファイルモードと所有権
マスクを指定してchmodメソッドを使用して、ファイルのモードまたはアクセス許可/アクセスリストを変更します-
以下は、既存のファイルtest.txtのモードをマスク値に変更する例です-
#!/usr/bin/ruby
file = File.new( "test.txt", "w" )
file.chmod( 0755 )
シニア番号 | マスクと説明 |
---|---|
1 | 0700 所有者のためのrwxマスク |
2 | 0400 所有者のr |
3 | 0200 オーナーはw |
4 | 0100 所有者の場合はx |
5 | 0070 グループのrwxマスク |
6 | 0040 グループのr |
7 | 0020 グループの場合はw |
8 | 0010 グループの場合はx |
9 | 0007 その他のrwxマスク |
10 | 0004 その他のr |
11 | 0002 その他はw |
12 | 0001 その他の場合はx |
13 | 4000 実行時にユーザーIDを設定する |
14 | 2000 実行時にグループIDを設定する |
15 | 1000 使用後もスワップされたテキストを保存する |
ファイルのお問い合わせ
次のコマンドは、ファイルを開く前にファイルが存在するかどうかをテストします-
#!/usr/bin/ruby
File.open("file.rb") if File::exists?( "file.rb" )
次のコマンドは、ファイルが本当にファイルであるかどうかを問い合わせます-
#!/usr/bin/ruby
# This returns either true or false
File.file?( "text.txt" )
次のコマンドは、指定されたファイル名がディレクトリであるかどうかを確認します-
#!/usr/bin/ruby
# a directory
File::directory?( "/usr/local/bin" ) # => true
# a file
File::directory?( "file.rb" ) # => false
次のコマンドは、ファイルが読み取り可能、書き込み可能、または実行可能かどうかを検出します-
#!/usr/bin/ruby
File.readable?( "test.txt" ) # => true
File.writable?( "test.txt" ) # => true
File.executable?( "test.txt" ) # => false
次のコマンドは、ファイルのサイズがゼロかどうかを検出します-
#!/usr/bin/ruby
File.zero?( "test.txt" ) # => true
次のコマンドはファイルのサイズを返します-
#!/usr/bin/ruby
File.size?( "text.txt" ) # => 1002
次のコマンドを使用して、ファイルのタイプを見つけることができます-
#!/usr/bin/ruby
File::ftype( "test.txt" ) # => file
ftypeメソッドは、file、directory、characterSpecial、blockSpecial、fifo、link、socket、unknownのいずれかを返すことによってファイルのタイプを識別します。
次のコマンドを使用して、ファイルがいつ作成、変更、または最後にアクセスされたかを確認できます。
#!/usr/bin/ruby
File::ctime( "test.txt" ) # => Fri May 09 10:06:37 -0700 2008
File::mtime( "text.txt" ) # => Fri May 09 10:44:44 -0700 2008
File::atime( "text.txt" ) # => Fri May 09 10:45:01 -0700 2008
Rubyのディレクトリ
すべてのファイルはさまざまなディレクトリに含まれており、Rubyもこれらを問題なく処理できます。一方、ファイルのクラスハンドルファイル、ディレクトリがで扱われるのDirクラス。
ディレクトリをナビゲートする
Rubyプログラム内のディレクトリを変更するには、次のようにDir.chdirを使用します。この例では、現在のディレクトリを/ usr / binに変更します。
Dir.chdir("/usr/bin")
Dir.pwd −を使用して、現在のディレクトリが何であるかを確認できます。
puts Dir.pwd # This will return something like /usr/bin
Dir.entries −を使用して、特定のディレクトリ内のファイルとディレクトリのリストを取得できます。
puts Dir.entries("/usr/bin").join(' ')
Dir.entriesは、指定されたディレクトリ内のすべてのエントリを含む配列を返します。Dir.foreachは同じ機能を提供します-
Dir.foreach("/usr/bin") do |entry|
puts entry
end
ディレクトリリストを取得するさらに簡潔な方法は、Dirのクラス配列メソッドを使用することです。
Dir["/usr/bin/*"]
ディレクトリの作成
Dir.mkdirは、ディレクトリを作成するために使用することができます-
Dir.mkdir("mynewdir")
mkdir −を使用して、新しいディレクトリ(既存のディレクトリではない)にアクセス許可を設定することもできます。
NOTE −マスク755は、パーミッションの所有者、グループ、ワールド[誰でも]をrwxr-xr-xに設定します。ここで、r =読み取り、w =書き込み、x =実行です。
Dir.mkdir( "mynewdir", 755 )
ディレクトリの削除
Dir.deleteは、ディレクトリを削除するために使用することができます。Dir.unlinkとDir.rmdirはまったく同じ機能を実行し、便宜のために提供されます。
Dir.delete("testdir")
ファイルと一時ディレクトリの作成
一時ファイルとは、プログラムの実行中に一時的に作成される可能性があるが、情報の永続的な保存ではないファイルです。
Dir.tmpdirは、現在のシステムの一時ディレクトリへのパスを提供しますが、このメソッドはデフォルトでは使用できません。Dir.tmpdirを使用可能にするには、require'tmpdir 'を使用する必要があります。
あなたは使用することができますDir.tmpdirをしてFile.joinプラットフォームに依存しない一時ファイルを作成するために-
require 'tmpdir'
tempfilename = File.join(Dir.tmpdir, "tingtong")
tempfile = File.new(tempfilename, "w")
tempfile.puts "This is a temporary file"
tempfile.close
File.delete(tempfilename)
このコードは、一時ファイルを作成し、それにデータを書き込み、削除します。Rubyの標準ライブラリには、一時ファイルを作成できるTempfileというライブラリも含まれています。
require 'tempfile'
f = Tempfile.new('tingtong')
f.puts "Hello"
puts f.path
f.close
組み込み関数
ファイルとディレクトリを処理するためのruby組み込み関数は次のとおりです-
ファイルクラスとメソッド。
Dirクラスとメソッド。