English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ruby ファイルの読み書き

Rubyは一式のI/O に関連するメソッドは、カーネル(Kernel)モジュールで実装されています。すべての I/O メソッドは IO クラスから派生しています。

IO すべての基本的なメソッドが提供されています。 read、write、gets、puts、readline、getc および printf

この章では、Rubyで利用できる基本的な I/関数についてもっと詳しく知りたい場合は、Rubyの IO クラス。

puts

前の章では、変数に割り当て、それを使用して puts 文は出力を表示します。

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

gets

gets 文は 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 文は異なります。puts 文は整个字符串输出到屏幕上,而 putc 文はそれぞれの文字を順次出力するために使用できます。

オンラインサンプル

以下のコードの出力は文字 H だけです:

オンラインサンプル

#!/usr/bin/ruby
 
str="Hello Ruby!"
putc str

上記の例の実行結果は以下の通りです:

H

print

print 文と puts 文は似ていますが、 puts 文は出力内容の後に次の行に移動しますが、 print 文が書かれた行に光標が位置します。

オンラインサンプル

#!/usr/bin/ruby
 
print "Hello World"
print "Good Morning"

上記の例の実行結果は以下の通りです:

Hello WorldGood Morning

ファイルの開閉

今までに、標準入出力への読み取りと書き込みを行いました。今、実際のデータファイルの操作方法を見てみましょう。

File.new 方法

以下のように使用できます: File.new 方法で作成了一个 File オブジェクトは読み取り、書き込み、または読み書きに使用されます。読み書き権は mode パラメータに依存します。最後に、 File.close 方法でファイルを閉じます。

文法

aFile = File.new("filename", "mode")
   # ... ファイル処理
aFile.close

File.open 方法

以下のように使用できます: File.open 方法は新しい file オブジェクトを作成し、その file オブジェクトをファイルに割り当てますが、File.open および File.new 方法間には少し異なります。異なる点は、 File.open 方法はブロックに関連付けられますが、 File.new 方法はできません。

File.open("filename", "mode") do |aFile|
   # ... ファイルを処理します
end

以下の表に、ファイルをオープンする際の異なるモードが示されています:

モード描述
r只読みモード。ファイルポインタはファイルの先頭に置かれます。これはデフォルトのモードです。
r+読み取り書き込みモード。ファイルポインタはファイルの先頭に置かれます。
w書き込みモード。ファイルが存在する場合、ファイルを上書きします。ファイルが存在しない場合、書き込み用の新しいファイルを作成します。
w+読み取り書き込みモード。ファイルが存在する場合、既存のファイルを上書きします。ファイルが存在しない場合、読み取り書き込み用の新しいファイルを作成します。
a書き込みモード。ファイルが存在する場合、ファイルポインタはファイルの末尾に置かれます。つまり、追加モードです。ファイルが存在しない場合、書き込み用の新しいファイルを作成します。
a+読み取り書き込みモード。ファイルが存在する場合、ファイルポインタはファイルの末尾に置かれます。つまり、追加モードです。ファイルが存在しない場合、読み取り書き込み用の新しいファイルを作成します。

ファイルの読み取りと書き込み

シンプルなI/Oのメソッドはすべてのfileオブジェクトに適用できます。したがって、getsは標準入力から一行を読み取ります。aFile.gets ファイルオブジェクトaFileから一行を読み取ります。

ただし、I/O オブジェクトは追加設定のアクセス方法を提供し、便利にしてくれます。

sysread 方法

以下のメソッドを使用できます。 sysread ファイルの内容を読み取るために、sysreadを使用します。ファイルをどのモードでもオープンできます。例えば:

以下は入力テキストファイルです:

これはテストのために使用されるシンプルなテキストファイルです。

このファイルを読み取ろうとしてみましょう:

オンラインサンプル

#!/usr/bin/ruby
 
aFile = File.new("input.txt", "r")
if aFile
   content = aFile.sysread(20)
   puts content
else
   ファイルをオープンできません!と表示します。
end

このステートメントは入力ファイルの先頭 20 文字。ファイルポインタはファイルの第 21 文字の位置

syswrite 方法

以下のメソッドを使用できます。 syswrite ファイルに内容を書き込むための方法として、syswriteを使用します。ファイルを書き込みモードでオープンする必要があります。例えば:

オンラインサンプル

#!/usr/bin/ruby
 
aFile = File.new("input.txt", "r+)
if aFile
   aFile.syswrite("ABCDEF")
else
   ファイルをオープンできません!と表示します。
end

このステートメントは「ABCDEF」をファイルに書き込みます。

each_byte 方法

このメソッドはクラスに属しています。 Fileメソッド each_byte これは文字列の各文字をイテレートできるものです。以下のコード例をご覧ください:

オンラインサンプル

#!/usr/bin/ruby
 
aFile = File.new("input.txt", "r+)
if aFile
   aFile.syswrite("ABCDEF")
   aFile.rewind
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   ファイルをオープンできません!と表示します。
end

字符一个接着一个被传到变量 ch,然后显示在屏幕上,如下所示:

A.B.C.D.E.F.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.readlines 是 IO 类中的一个方法。该方法逐行返回文件的内容。下面的代码显示了方法 IO.readlines 的使用:

オンラインサンプル

#!/usr/bin/ruby
 
arr = IO.readlines("input.txt")
puts arr[0]
puts arr[1]

在这段代码中,变量 arr 是一个数组。文件 input.txt 的每一行将是数组 arr 中的一个元素。因此,arr[0] 将包含第一行,而 arr[1] 将包含文件的第二行。

IO.foreach 方法

该方法也逐行返回输出。方法 foreach 与方法 readlines 之间不同的是,方法 foreach 与块相关联。但是,不像方法 readlines,方法 foreach 不是返回一个数组。例如:

オンラインサンプル

#!/usr/bin/ruby
 
IO.foreach("input.txt"){|block| puts block}

这段代码将把文件 test 的内容逐行传给变量 block,然后输出将显示在屏幕上。

重命名和删除文件

以下のように、現在のディレクトリを変更します: rename および delete 方法重命名和删除文件。

下面的示例重命名一个已存在文件 test1.txt

オンラインサンプル

#!/usr/bin/ruby
 
# 重命名文件 test1.txt 为 test2.txt
File.rename( "test1.txt", "test2.txt" )

下面的示例删除一个已存在文件 test2.txt

オンラインサンプル

#!/usr/bin/ruby
 
# 删除文件 test2.txt
File.delete("text2.txt")

文件模式与所有权

使用带有掩码的 chmod 方法来改变文件的模式或权限/访问列表:

下面的示例改变一个已存在文件 test.txt 的模式为一个掩码值:

オンラインサンプル

#!/usr/bin/ruby
 
file = File.new( "test.txt", "w" )
file.chmod( 0755 )

下表列出了 chmod 方法中可使用的不同的掩码:

マスク描述
0700rwx 掩码,針對所有者
0400r ,針對所有者
0200w ,針對所有者
0100x ,針對所有者
0070rwx 掩码,針對所有組
0040r ,所属グループに対して
0020w ,所属グループに対して
0010x ,所属グループに対して
0007rwx マスク,他人に対して
0004r ,他人に対して
0002w ,他人に対して
0001x ,他人に対して
4000実行時にユーザー ID を設定します
2000実行時に所属グループ ID を設定します
1000交換テキストを保存し、使用後に保存もされます

ファイルクエリ

以下のコマンドは、ファイルを開く前にファイルが存在するかどうかを確認します:

オンラインサンプル

#!/usr/bin/ruby
 
File.open("file.rb") if File::exists?("file.rb")

以下のコマンドは、ファイルが実際にファイルかどうかを確認します:

オンラインサンプル

#!/usr/bin/ruby
 
# trueまたはfalseを返します
File.file?("text.txt")

以下のコマンドは、指定されたファイル名がディレクトリかどうかを確認します:

オンラインサンプル

#!/usr/bin/ruby
 
# ディレクトリ
File::directory?("/usr/local/bin" # => true
 
# ファイル
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") # => 金曜日 5月 09 10:06:37 -0700 2008
File::mtime("text.txt") # => 金曜日 5月 09 10:44:44 -0700 2008
File::atime("text.txt") # => 金曜日 5月 09 10:45:01 -0700 2008

Rubyのディレクトリ

すべてのファイルはディレクトリに含まれています。Rubyはファイルとディレクトリの処理方法を提供します。File Fileクラスを使用してファイルを処理します。Dir Dirクラスを使用してディレクトリを処理します。

ディレクトリをブラウズします。

Rubyプログラムでディレクトリを変更するには、以下のように使用します: Dir.chdir。以下の例では、現在のディレクトリを変更します: /usr/bin

Dir.chdir("/usr/bin")

以下のように、現在のディレクトリを変更します: Dir.pwd 現在のディレクトリを確認します:

puts Dir.pwd # 現在のディレクトリを返します、 /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を使用して新しいディレクトリ(既存のディレクトリではありません)上の権限を設定することもできます:

注意:マスク 755 所有者(owner)、所属グループ(group)、全員(world [anyone])の権限を rwxr に設定します。-xr-x、r = read 読み取り、w = write 書き込み、x = execute 実行。

Dir.mkdir( "mynewdir", 755 )

ディレクトリの削除

Dir.delete ディレクトリの削除に使用できます。Dir.unlink および Dir.rmdir 同様の機能を提供して、便利さを提供します。

Dir.delete("testdir")

ファイルと一時ディレクトリの作成

一時ファイルは、プログラムの実行中に一時的に作成されるが、永続的に保存されない情報です。

Dir.tmpdir 現在のシステム上の一時ディレクトリのパスを提供します。ただし、このメソッドはデフォルトでは利用できません。 Dir.tmpdir 使用するためには、必須の '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 でファイルとディレクトリを処理する内蔵関数の完全なリストを提供します: