2011-02-11 5 views
1

특정 이름의 파일을 검색하고 싶습니다. 현재 작업 디렉토리에서 시작하여 루트 또는 동등한 위치에 도달 할 때까지 이동 가능한 방식으로 계층 구조를 정리합니다.Ruby에서 디렉토리 계층 구조를 이식 할 수 있습니까?

예 : 리눅스 환경, 내가 할 수 있다는 것을 알고있다

dir = '.' 
while File.expand_path(dir) != '/' do 
    <check for the file> 
    dir = File.join dir, '..' 
end 

... 그러나 상위 디렉토리 체인이 끝나는 곳에 관계없이 작동하는 방법이 더 좋습니까?

또한 로컬 변수를 멀리 리팩터링하는 것이 좋지만 아직 좋은 방법을 제시하지 못했습니다.

답변

2

디렉토리 트리의 루트에있는 "cd .."은 거의 모든 환경에서 동일합니다. 따라서 한 레벨 위로 올라가서 같은 디렉토리에 있으면 루트가됩니다.

while 루프에서 상태를 확인하십시오.

+0

정확히 내가 뭘 찾고 있었는지, 고마워! – Ilkka

+0

일부 사람들에게 도움이 될 수 있습니다. 젠킨스가 사용하는 레이크 파일에서 Dir.chdir ("..")을 사용해야했습니다. – timhc22

0

상위 디렉토리 체인이 끝나는 위치와 관계없이 작동하는 방법이 더 좋습니까?

부모 디렉토리의 체인이 루트 디렉토리 이외의 위치로 끝나는 위치는 어디입니까? 드라이브의 디렉토리 구조는 나무이거나 반대 트리가됩니다. "루트"디렉토리는 항상 동일합니다. 그것은 당신이 갈 수있는만큼 낮습니다.

코드는 문제가 없습니다. 당신은 다른 방법으로 그것을 할 수 있지만, 나는 당신이 명료성이나 단순함에서 많은 것을 얻을 것이라고 생각하지 않습니다. 당신은 아마도 더 빠른 것을 발견 할 것이지만, 속도의 사소한 차이로 다른 두 가지를 교환 할 수 있습니다, 그리고 나는 당신이 속도 향상에 주목할 것입니다.

고유 한 루비 코드가 아닙니다. 즉, 일반적으로 배열을 사용하고 반복적으로 반복하지만 단순성이나 청결성 측면에서 볼 때 많이 팔리는 사례는 없습니다.

저는 90 %와 실버 스타를드립니다. 잘 했어.


편집 :

나는 @ 존 Feminella 준 답을 좋아한다. 드라이브 시스템의 뿌리를 때리고 크로스 플랫폼에서 잘 작동하는지 판단하는 것이 상식입니다. 임의로 변경되는 루트 지정을 제공하는 시스템을 생각할 수 없으므로 디렉토리가 더 이상 변경되지 않을 때까지 반복하십시오.

+0

예, 나무입니다. 그러나 Windows에서'File.expand_path (dir) == '/'', 혹시? – Ilkka

관련 문제