2012-06-14 1 views
0

텍스트 파일을 읽어서 정보를 얻었고 나중에 파일이 들어있는 디렉토리의 이름을 바꾸어야합니다. 파일이 잠겨 있습니다. 파일에서 읽는 함수를 주석 처리하거나 수동으로 파일 (잠금 해제 유틸리티)의 잠금을 해제하면 모든 것이 잘됩니다.파일을 읽은 후 루비가 Windows XP에서 열거 나 잠김 상태로 남았습니다.

내가 루비 1.8.7 (2010-08-16 패치 레벨 302)에 오전은 [I386-mingw32]

이 줄은

이 두 라인 File.open(file).readlines.each{|line|이 파일을 열어두고 파일을 열어 둡니다

my_file=File.open(file,"r") 
    my_file.collect {|line| 

나는 my_file.close

man for core 1.8.7 of IO.html#method-c-open 상태

를 사용하여 끝 부분에있는 파일을 닫습니다하지 않는 한

선택적 코드 블록이 제공되면 인수로 인수가 전달되고 블록이 종료되면 IO 객체가 자동으로 닫힙니다.

그래서 파일이 아직 열리지 않은 이유를 모르겠습니다.

텍스트 파일을 읽고 자동으로 닫으려면 1.8.7의 한 줄 코드는 무엇입니까?

답변

5

문서가 명확합니다. 그러나 블록을 collect으로 전달 중입니다. open으로 전달하지 않으므로 파일을 닫아야합니다.

파일이 자동 폐쇄, 이것을 시도해야합니다 : 당신이 블록에 파일 핸들을 거치지 않고 자동적으로 파일을 닫 블록을 원하는 경우

File.open(file,"r") do |f| 
    f.collect # or whatever 
end 
+0

그래서 내가 어떻게 읽을 것 한 줄에 열기를 사용하여 배열에 텍스트 파일? – Radek

+1

대답을 –

+2

@ 업데이트 : "한 줄"이 언제까지 유효한 요구 사항일까요? (힌트 : 절대로) –

1

, 당신의 IO #의 readlines 메쏘드 방법을 사용할 수 있습니다 파일 객체.

array_of_lines = File.readlines('/tmp/foo') 

이렇게하면 파일의 전체 내용을 읽은 다음 파일 핸들을 닫습니다. 파일이 메모리에 쉽게 들어갈만큼 작을 때마다 좋은 옵션입니다.

File.open(file, 'r') do |f| 
    f.each_line do |line| 
    # Process each line 
    end 
end 

을 또는 당신은 단지 하나의 샷 파일 내용을 원하는 경우 다음이 시도 :

+0

줄 단위로 읽는 것이 메모리를 절약합니까? – Radek

+1

개념적으로, 그렇습니다. 파일 slurp는 전체 파일을위한 공간을 할당해야합니다. #each_line 및 친구들은 한 번에 줄의 공간 만 할당하면됩니다. –

+0

File.readlines()를 사용하여 큰 파일을 배열로 읽어 들이면 어떻게 메모리를 비울 수 있습니까? – Radek

1

직접 "열기"호출 블록을 통과 시도

lines = File.read(file).split(/\r?\n/) 
+0

'line'수준의 조건이 있다고 가정 해 봅시다. true 인 경우 파일 처리를 중단하고 싶습니다. 어떻게해야합니까? – Radek

관련 문제