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.openFile.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.unlinkDir.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クラスとメソッド。