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

Ruby 파일의 입력과 출력

Ruby는 전체 I/O 관련 메서드는 커널(Kernel) 모듈에서 구현됩니다. 모든 I/O 메서드는 IO 클래스에서 파생되었습니다.

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 모든 기본 메서드를 제공합니다. read、write、gets、puts、readline、getcprintf

이 장에서는 Ruby에서 사용할 수 있는 모든 기본 I/O 함수. 더 많은 함수에 대해 알고 싶다면 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

위의 예제 실행 결과는 다음과 같습니다:

값을 입력하세요:
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.openFile.new 메서드 간에 조금 다릅니다. 다른 점은 File.open 메서드는 블록과 연결할 수 있으며 File.new 메서드는 할 수 없습니다.

File.open("filename", "mode") do |aFile|
   # ... process the file
end

下表列出了打开文件的不同模式:

模式설명
r只读模式。文件指针被放置在文件的开头。这是默认模式。
r+读写模式。文件指针被放置在文件的开头。
w只写模式。如果文件存在,则重写文件。如果文件不存在,则创建一个新文件用于写入。
w+读写模式。如果文件存在,则重写已存在的文件。如果文件不存在,则创建一个新文件用于读写。
a只写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于写入。
a+读写模式。如果文件存在,则文件指针被放置在文件的末尾。也就是说,文件是追加模式。如果文件不存在,则创建一个新文件用于读写。

读取和写入文件

用于简单 I/O 的方法也可用于所有 file 对象。所以,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.rewind
   aFile.each_byte {|ch| putc ch; putc ?. }
else
   puts "Unable to open file!"
end

자음 하나씩 전달되어 화면에 표시됩니다:

문자가 하나씩 변수 ch에 전달되어 화면에 표시됩니다. 예를 들어:

IO.readlines 이 메서드

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... 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에 전달한 후, 출력은 화면에 표시됩니다

재명명과 삭제

您可以通过 renamedelete 메서드를 사용하여 파일을 재명명하고 삭제합니다

다음 예제는 존재하는 파일을 재명명합니다 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

아래 명령어는 파일 크기가 0인지 확인합니다:

온라인 예제

#!/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") # => 금요일 마이 09 10:06:37 -0700 2008
File::mtime("text.txt") # => 금요일 마이 09 10:44:44 -0700 2008
File::atime("text.txt") # => 금요일 마이 09 10:45:01 -0700 2008

Ruby 中的目录

所有的文件都是包含在目录中,Ruby 提供了处理文件和目录的方式。File 类用于处理文件,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.unlinkDir.rmdir 执行同样的功能,为我们提供了便利。

Dir.delete("testdir")

创建文件 & 临时目录

临时文件是那些在程序执行过程中被简单地创建,但不会永久性存储的信息。

Dir.tmpdir 提供了当前系统上临时目录的路径,但是该方法默认情况下是不可用的。为了让 Dir.tmpdir 可用,使用必需的 'tmpdir' 是必要的。

您可以把 Dir.tmpdirFile.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에서 파일과 디렉토리를 처리하는 내장 함수의 전체 목록을 제공합니다: