임시 파일을 생성하면 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의 임시 파일에 대해 배웠습니다. 수업!
이제 여러분이 연습할 차례입니다.
읽어주셔서 감사합니다 🙂