2013-12-16 2 views
0

File.dirname을 사용하여 Windows 상자에서 파일 디렉터리를 가져 오려고합니다. Windows 상자에서 파일 (아래 "file1")을 가져 와서 스크립트가 실행되는 Mac OS X 상자로 반환합니다. 내가 왜 그것을에서 혼란 스러워요File.dirname이 경로를 예상 할 때 마침표를 반환하는 이유는 무엇입니까?

file1 = "C:\Administrator\proj1\testFile.txt" 
path = "#{File.dirname(file1)}" 
puts "#{path}" 

>> . 

아래

file1 = "C:\Administrator\proj1\testFile.txt"

는 더 명확, 내가 원격 상자에서이 값을 받고 내 개발 상자에 반환하고 만들기 위해, 그러나, 나의 예를 단순화하는 것입니다 '.'을 반환합니다. 나는 File.dirname 다음 말한다 ruby-doc.org에 보았다.

는 "지난 제외한 FILE_NAME에 주어진 이름의 모든 구성 요소를 반환 파일 이름은 모두 파일 :: SEPARATOR를 사용하여 파일을 형성 할 수있다 :: ALT_SEPARETOR는 File :: ALT_SEPARATOR가 nil이 아닌 경우 구분 기호로 사용됩니다. "

나는 File::SEPARATORFile::ALT_SEPARATORputs을했고, 다음 가지고 :

File::SEPARATOR >>/
File::ALT_SEPARATOR >> 

내가 "\"는 유효한 파일 분리되지 않았기 때문에 그것이 가정한다. 그래서 File::ALT_SEPARATOR을 "\"로 설정했습니다. 그러나 그 후에도 나는 puts path 일 때 동일한 값을 얻습니다.

file1 = "C:\Administrator\proj1\testFile.txt" 
path = "#{File.realdirpath(file1)}" 
puts "{path}" 

>> /Users/me/myProject/C:\Administrator\proj1\testFile.txt 

내가 루비 스크립트라는 곳에서 경로를 추가하는 듯 (파일 이름 포함)의 전체 경로를 추가 :

나는 File.realdirpath를 사용하여 시도하고이 결과였다. 이상한 행동으로 보입니다.

모든 아이디어, 의견 또는 제안 사항이 우수 할 것입니다.

+1

코드에 문제가 있습니다. 'puts "path"'도트 문자열이 아니라'path' 문자열을 출력합니다. –

+0

죄송합니다. 그것을 잘못해서 복사했습니다. 이제 해결되었습니다. –

+0

왜 문자열 보간법을 사용하고 있습니까? –

답변

0

알아 냈습니다. Ruby 버전을 사용하면서 문제가되었습니다. 나는 루비 1.9.3을 사용하고 있었고 jruby 1.7.3으로 바꾸었다.

+0

jRuby는 MRI와 같은 경로 분석으로 동일한 동작을 나타 내기 때문에 Ruby 버전과 관련이 없어야합니다. 두 경우 모두 기본 OS에 의존해야합니다. –

0

file1을 선언 할 때 문제는 그 백 슬래시가 이스케이프 문자를 정의한다는 것입니다. 나는

file1 = "C:\\Administrator\\proj1\\testFile.txt" 
file1 = "C:/Administrator/proj1/testFile.txt" 
+0

실제로 문자열을 설정하지 않습니다.리모트 윈도우 박스에서 돌아온 것입니다. –

0

좋아 : 당신이 문자열에서 파일 경로를 저장할 경우, 하나가 슬래시 또는 더블 백 슬래시를 앞으로 사용할 필요가

file1 = "C:\Administrator\proj1\testFile.txt" 
=> "C:Administratorproj1\testFile.txt" 

(이스케이프 문자를 탈출) : 반환을 주목하라 이 문제도 재현 할 수있었습니다. @fbonetti는 지적

, 당신은 탈출로 백 슬래시 해석에서 루비를 유지하기 위해 작은 따옴표와 디렉토리를 둘러싸, 그래서 시작해야 ...

>> file1='C:\Administrator\proj1\testFile.txt' 
=> "C:\\Administrator\\proj1\\testFile.txt" 

를 그런 다음에 GSUB를 통해 파일 1 통과 슬래시를 '정상화'하고 예상 한 결과를 제공합니다.

>> File.dirname(file1.gsub('\\', '/')) 
=> "C:/Administrator/proj1" 

물론 백 슬래시가 필요할 경우 gsub을 항상 뒤집을 수 있습니다.

>> File.dirname(file1.gsub('\\', '/')).gsub('/', '\\') 
=> "C:\\Administrator\\proj1" 
+1

백 슬래시를 전혀 사용하지 않고 루비의 IO 문서에서 말하는대로 슬래시를 사용하십시오. –

+0

다른 소스를 통해 백 슬래시가 공급되고 있다고 가정했습니다. – Donovan

0

Ruby의 IO 문서는 다른 OS 경로 구분 기호를 처리 할 때 큰 도움이됩니다. the documentation :

가능하면 Ruby는 다른 운영 체제 규칙간에 경로 이름을 변환합니다. 예를 들어, Windows 시스템에서 파일 이름 "/gumby/ruby/test.rb"는 "\ gumby \ ruby ​​\ test.rb"로 열립니다. 루비 문자열에서 Windows 스타일의 파일 이름을 지정하는 경우, 백 슬래시를 이스케이프 기억

"c:\\gumby\\ruby\\test.rb" 

우리의 사례가 여기에 유닉스 스타일 슬래시를 사용합니다; File :: ALT_SEPARATOR를 사용하여 플랫폼 별 분리 문자를 가져올 수 있습니다.

즉, 백 슬래시로 번거 로움을 할 필요가 없으며 작은 따옴표 나 큰 따옴표를 사용해야 할지도 모릅니다. 간단하게 유지하고, 슬래시를 사용하고 루비가 그것에 대해 걱정하게하십시오. 그렇게하면 코드가 * nix/Mac OS 및 Windows에서 이식 가능합니다.

그 외에도 큰 따옴표로 묶은 문자열과 작은 따옴표로 묶은 문자열에서 문자 이스케이프 처리가 어떻게 작동하는지 알아야 할 필요가있는 것처럼 보입니다. 이것은 "Programming Ruby"입니다 :

루비는 리터럴 문자열을 생성하기위한 여러 메커니즘을 제공합니다. 각각은 String 유형의 객체를 생성합니다. 서로 다른 메커니즘은 문자열의 구분 방법과 리터럴의 내용에 대한 대체 방법에 따라 다릅니다.

작은 따옴표로 묶인 문자열 리터럴 ('stuff'및 % q/stuff /)은 최소 치환을 거칩니다. 둘 다 시퀀스를 단일 백 슬래시로 변환하고 작은 따옴표가있는 양식은 \ '를 작은 따옴표로 변환합니다.

'hello' » hello 
'a backslash \'\\\'' » a backslash '\' 
%q/simple string/ » simple string 
%q(nesting (really) works) » nesting (really) works 
%q no_blanks_here ; » no_blanks_here 

따옴표 문자열 ("재료"%의 Q/재료/및 %/물건 /) 203 페이지

대체의 표 182에 도시 된 추가적인 치환을 거칠 큰 따옴표로 묶인 문자열

\\a Bell/alert (0x07) \\nnn  Octal nnn 
\\b Backspace (0x08) \\xnn  Hex nn 
\\e Escape  (0x1b) \\cx  Control-x 
\\f Formfeed  (0x0c) \\C-x  Control-x 
\\n Newline  (0x0a) \\M-x  Meta-x 
\\r Return  (0x0d) \\M-\\C-x Meta-control-x 
\\s Space  (0x20) \\x  x 
\\t Tab   (0x09) #{expr} Value of expr 
\\v Vertical tab (0x0b) 


a = 123 
"\123mile" » Smile 
"Say \"Hello\"" » Say "Hello" 
%Q!"I said 'nuts'," I said! » "I said 'nuts'," I said 
%Q{Try #{a + 1}, not #{a - 1}} » Try 124, not 122 
%<Try #{a + 1}, not #{a - 1}> » Try 124, not 122 
"Try #{a + 1}, not #{a - 1}" » Try 124, not 122 
관련 문제