Ruby-파일 I / O
Ruby는 Kernel 모듈에 구현 된 I / O 관련 메서드 전체를 제공합니다. 모든 I / O 메서드는 IO 클래스에서 파생됩니다.
IO 클래스 는 read, write, gets, puts, readline, getc 및 printf 와 같은 모든 기본 메소드를 제공합니다 .
이 장에서는 Ruby에서 사용할 수있는 모든 기본 I / O 기능을 다룹니다. 더 많은 기능은 Ruby Class 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 문은 한 번에 한 문자를 출력하는 데 사용할 수 있습니다.
예
다음 코드의 출력은 문자 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의 새로운 파일 객체를 만들고 파일에 해당 파일 오브젝트를 할당하는 방법을. 그러나 File.open 및 File.new 메서드 에는 한 가지 차이점이 있습니다. 차이가 있다는 것이다 File.open의 사용자가 사용하는 동일한 기능을 수행 할 수없는 반면, 방법은 블록과 연관 될 수 File.new의 방법.
File.open("filename", "mode") do |aFile|
# ... process the file
end
Sr. 아니. | 모드 및 설명 |
---|---|
1 | r 읽기 전용 모드. 파일 포인터는 파일 시작 부분에 위치합니다. 이것이 기본 모드입니다. |
2 | r+ 읽기-쓰기 모드. 파일 포인터는 파일의 시작 부분에 있습니다. |
삼 | 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에 하나씩 전달되고 다음과 같이 화면에 표시됩니다.
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 클래스 메서드 중 하나는 IO.readlines 입니다. 이 메서드는 파일 내용을 한 줄씩 반환합니다. 다음 코드 표시 방법의 사용 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}
이 코드는 파일 테스트 의 내용을 한 줄씩 변수 블록에 전달하고 출력이 화면에 표시됩니다.
파일 이름 변경 및 삭제
rename 및 delete 메서드를 사용하여 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 )
Sr. 아니. | 마스크 및 설명 |
---|---|
1 | 0700 소유자 용 rwx 마스크 |
2 | 0400 r (소유자) |
삼 | 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
다음 명령은 파일의 크기가 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" ) # => 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도 이러한 파일을 처리하는 데 문제가 없습니다. File 클래스는 파일을 처리 하는 반면 , 디렉토리는 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
내장 기능
다음은 파일과 디렉토리를 처리하는 루비 내장 함수입니다.
파일 클래스 및 방법 .
Dir 클래스 및 방법 .