2013-12-16 73 views
0

我想使用File.dirname來獲取Windows盒子上文件的目錄。我從Windows窗口中獲取文件(下面的「file1」),並將其返回到運行該腳本的Mac OS X框中。爲什麼File.dirname會返回期望的路徑?

下面file1 = "C:\Administrator\proj1\testFile.txt"是簡化我的例子,然而,以使其更清晰,我從遙控盒得到這個值,並將其返回到我的開發:

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

>> . 

我很困惑,爲什麼它將返回'.'。我對ruby-doc.org看到File.dirname說以下內容:

「返回FILE_NAME給出除了最後一個文件名的所有組件都可以使用這兩種文件::分離器和文件形成的文件名::當File :: ALT_SEPARATOR不爲零時,將ALT_SEPARETOR作爲分隔符。「

我對File::SEPARATORFile::ALT_SEPARATOR做了puts,得到了以下幾點:

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

我認爲這是因爲「\」是不是有效的文件分隔符。所以我將File::ALT_SEPARATOR設置爲「\」。但是,即使在那之後,當我puts path時,我仍然得到相同的值。

我嘗試使用File.realdirpath這是結果:

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

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

它似乎增加從那裏我叫Ruby腳本的路徑和附加的完整路徑(包括文件名)。似乎是奇怪的行爲。

任何想法,意見或建議將是偉大的。

+1

您的代碼有問題。 'puts「path」'會打印字符串'path',甚至不是一個點。 –

+0

對不起。只是把它複製錯了。現在修復。 –

+0

你爲什麼使用字符串插值? –

回答

0

我想通了。這是我使用的Ruby版本的一個問題。我使用紅寶石1.9.3,然後我切換到jruby 1.7.3,它現在正常工作。

+0

它不應該與Ruby版本有任何關係,因爲jRuby應該表現出與MRI所做的路徑分辨率相同的行爲。無論哪種情況,他們都應該依賴基礎操作系統。 –

0

問題是,當你聲明file1時,那些反斜線定義了轉義字符。注意返回:

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

如果你想存儲文件路徑的字符串,您可能需要使用斜線或雙反斜線(逃避轉義字符):

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

我實際上沒有設置字符串。這就是我從遠程Windows框 –

0

好吧,我也能夠複製這個問題。

由於@fbonetti指出的那樣,你必須爲封裝與單引號的目錄,以保持紅寶石從解釋反斜槓作爲逃逸,因此與啓動...

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

然後,通過文件1通過gsub來完成'正常化'斜線,給你你期望的結果。

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

當然,如果你需要他們再次反斜槓,你總是可以逆轉gsub。

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

中得到的結果。更好的是,不要使用反斜槓,而是根據Ruby的IO文檔說的做,並使用正斜槓。 –

+0

我認爲反斜槓是通過其他來源提供的。 – Donovan

0

Ruby的IO文檔在處理不同的OS路徑分隔符時有很大的幫助。 From the documentation

如果可能,Ruby將在不同的操作系統約定之間轉換路徑名。例如,在Windows系統上,文件名「/gumby/ruby/test.rb」將打開爲「\ gumby \ ruby​​ \ test.rb」。當一個Ruby字符串,指定一個Windows風格的文件名,還記得逃離反斜槓:

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

我們的例子中,這裏將使用Unix風格的斜槓; File :: ALT_SEPARATOR可用於獲取平臺特定的分隔符。

因此,換句話說,你不需要用反斜槓麻煩,以及是否需要使用單或雙引號。保持簡單,並使用正斜槓,讓Ruby擔心它。這樣你的代碼可以在* nix/Mac OS和Windows上移植。

除此之外,看起來真的需要了解字符轉義如何在雙引號字符串與單引號字符串中起作用。這是從「Programming Ruby」:

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

置換在表18.2所示雙引號字符串

\\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 
相關問題