Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby에서 임시 파일을 만드는 방법

임시 파일을 생성하면 OS 내부에 임의의 이름을 가진 빈 파일이 생성됩니다. (운영 체제) 임시 폴더.

이 파일은 자동으로 삭제됩니다. .

Ruby에서 어떻게 합니까?

좋아요 :

require 'tempfile'

Tempfile.create { |f| f << "abc\n" }

f 위치 파일 및 << 씁니다.

이것은 Ruby에 내장되어 있으므로 보석을 설치할 필요가 없습니다.

알겠습니다.

간단하지만 여전히 궁금한 점이 있을 수 있습니다.

좋아요 :

  • 파일이 정확히 언제 삭제되나요?
  • 임시 파일에서 다시 읽을 수 없는 이유는 무엇입니까?
  • 임시 파일은 고유해야 합니까?

더 깊은 이해를 돕기 위해 이 질문과 몇 가지 추가 질문에 답하겠습니다!

새로 만들기와 만들기의 차이점은 무엇입니까?

Tempfile 파일을 생성하는 두 가지 방법이 있습니다.

하나는 new입니다. , 다른 하나는 create입니다. .

차이점은 무엇입니까?

문서에 따르면 new Tempfile 생성 개체(예상대로)이지만 create File 제공 개체.

Tempfile File에 위임 .

진짜 차이점은 create 차단을 허용합니다.

하지만 new 그렇지 않습니다.

시도 :

Tempfile.new {}

이 유용한 경고를 받게 됩니다. :

# warning: Tempfile.new doesn't call the given block.

create와 함께 블록을 사용할 수 있습니다. 차단이 끝난 후 임시 파일이 삭제되도록 합니다.

이것은 다음과 같은 질문을 불러옵니다...

A TempFile은 언제 삭제되나요?

일반 파일처럼 직접 삭제(delete)하여 파일이 삭제되는 시기를 제어할 수 있습니다. 메소드) 또는 create 사용 블록으로.

자동 삭제가 작동하는 경우 :

  • 프로그램 종료
  • 파일은 "가비지 수집"됩니다. 즉, 공간을 확보하기 위해 알고리즘에 의해 파일이 메모리에서 제거됩니다.

파일에 대한 참조를 보유하지 않은 경우에만 나중에 발생할 수 있습니다.

변수처럼.

이것이 내 뜻입니다 :

t = Tempfile.new

t일 때 범위를 벗어나면 임시 파일을 제거할 수 있습니다.

Linux를 사용하는 경우 실시간으로 어떤 파일이 생성 및 삭제되는지 확인하는 매우 흥미로운 도구는 inotify-tools입니다.

이 명령어 시도 :

inotifywait /tmp -m --format "%w %e %f %T" --timefmt "%H:%m:%S"

그런 다음 파일을 생성하는 Ruby 코드를 실행하세요.

:

ruby -rtempfile -e "def c; t = Tempfile.new('testing'); end; c; sleep 10"

이 항목이 표시됩니다. :

/tmp/ CREATE testing20190506-11391-1wqcng0 14:51:48
/tmp/ OPEN testing20190506-11391-1wqcng0 14:51:48
/tmp/ CLOSE_WRITE,CLOSE testing20190506-11391-1wqcng0 14:51:58
/tmp/ DELETE testing20190506-11391-1wqcng0 14:51:58

임시 파일에서 다시 읽을 수 없는 이유는 무엇입니까?

임시 파일 중 하나에서 다시 읽으려고 하면 빈 문자열이 표시됩니다.

:

Tempfile.create { |f| f << "abc\n"; f.read }
# ""

그 이유는 무엇입니까?

Files IO 개체.

IO 개체에는 위치 포인터가 있습니다. &파일에 쓸 때 이 위치가 진행됩니다.

따라서 읽으려면 이 포인터를 되감아야 합니다.

좋아요 :

Tempfile.create { |f| f << "abc\n"; f.rewind; f.read }
# "abc\n"

파일 내용을 플러시해야 할 수도 있습니다.

:

temp = Tempfile.new

temp << "1"
temp << "2"

temp.flush

Tempfile은 정말 고유합니까?

Tempfile은 고유한 파일 이름을 만들고 권한 모드를 600으로 설정하므로 이 파일을 만든 사용자만 읽을 수 있습니다.

하지만 중복된 이름이 있을 수 있나요?

문서에 다음과 같이 나와 있습니다. :

<블록 인용>

"Tempfile의 파일 이름 선택 방법은 스레드로부터 안전하고 프로세스 간 안전합니다. 다른 스레드나 프로세스가 동일한 파일 이름을 선택하지 않도록 보장합니다."

그리고 new에 대한 설명 또한 고유한 파일 이름을 찾을 수 없으면 오류가 발생할 수 있다고 말합니다.

파일에 접두사를 설정할 수 있다는 것도 알아두는 것이 좋습니다.

좋아요 :

Tempfile.new("banana-").path
# "/tmp/banana-20190426-25403-1cm7sjt"

이렇게 하면 이름 충돌 가능성이 줄어듭니다.

바이너리 모드에서 임시 파일 열기

이미지, 음악 또는 일반 텍스트가 아닌 다른 작업을 하는 경우 파일 모드를 바이너리로 설정하는 것이 좋습니다.

바이너리 파일 모드는 줄 끝 변환을 중지합니다.

결과적으로 데이터가 더 "원시"되고 바이너리 파일의 일부가 깨지는 것을 방지할 수 있습니다.

바이너리 모드는 기본적으로 활성화되어 있지 않습니다. :

temp = Tempfile.new

temp.binmode?
# false

다음과 같이 활성화할 수 있습니다. :

temp = Tempfile.new
temp.binmode

temp.binmode?
# true

이것은 create에서도 작동합니다. 방법:

Tempfile.create do |f|
  f.binmode

  f << "bacon\n"
end

요약

Tempfile을 사용하여 Ruby의 임시 파일에 대해 배웠습니다. 수업!

이제 여러분이 연습할 차례입니다.

읽어주셔서 감사합니다 🙂