2011-08-24 16 views
13

Chcę napisać aplikację działającą w systemie Windows i Linux. ale mam problem ze ścieżką, ponieważ Windows używa "\" i Linux używa "/". jak mogę rozwiązać ten problem. dziękiUkośnik i ukośnik w Ruby

Odpowiedz

17

W Ruby, nie ma różnicy między ścieżkami w systemie Linux lub Windows. Ścieżka powinna używać / niezależnie od środowiska. Tak więc, aby użyć dowolnej ścieżki w systemie Windows, zamień wszystkie \ na . File#join będzie działać zarówno w systemie Windows, jak i Linux. Na przykład w systemie Windows:

Dir.pwd 
=> "C/Documents and Settings/Users/prince" 

File.open(Dir.pwd + "/Desktop/file.txt", "r") 
=> #<File...> 

File.open(File.join(Dir.pwd, "Desktop", "file.txt"), "r") 
=> #<File...> 

File.join(Dir.pwd, "Desktop", "file.txt") 
=> "C/Documents and Settings/Users/prince/Desktop/file.txt" 
+2

Ohh, jeśli działa to tylko wtedy, gdy chcesz uruchomić zewnętrzne polecenia. – Automatico

+0

... nie jest prawdą, w oknach istnieją specjalne przedrostki takie jak \\? \ (Wymagane dla ścieżek> 260 bajtów), które są konwertowane na //?/Które nie mają żadnego znaczenia ... Tak więc funkcja jest rzeczywiście błędna afaict – estani

+0

@estani Nie powiedziałem, że jest to funkcja. Powiedziałem 'File.join' i infact, że wszystkie ścieżki są oddzielone przez'/'niezależnie od środowiska.W ten sposób ścieżki są reprezentowane w ruby ​​i musisz używać '/' nawet w przypadku systemu Windows do ścieżek plików podczas inicjowania pliku. – rubyprince

7

użyć klasy Pathname do generowania ścieżek, które następnie będą poprawne w systemie:

a_path = Pathname.new("a_path_goes_here") 

Korzyść z tego jest to, że pozwalają na katalogach łańcucha przez za pomocą operatora +:

a_path + "another_path" + "and another" 

Wywołanie a_path.to_s następnie wygenerować poprawną ścieżkę dla systemu, że jesteś na.

+2

Nie zapomnij wymagać "nazwy ścieżki", chyba że używasz gigantycznego środowiska programistycznego. –

+0

To nie działa dla Ruby 2.0.0 na Windowsie, chyba że czegoś mi brakuje: p = Pathname.new ("") p = p + "jabłko" + "banan" stawia p.to_s <- "apple/banana" –

+0

Zamiast tego użyj File.join, jest to prostsze i mniej irytujące niż ścieżka - i będzie działało dobrze. – shevy

6

Dopóki Ruby jest wykonywanie pracy, / w nazwach ścieżek jest ok na Windows

Kiedy trzeba wysłać ścieżkę jakiś inny program do wykorzystania, szczególnie w linii poleceń lub coś w rodzaju wysyłania plików w przeglądarce, musisz przekonwertować ukośniki na ukośniki odwrotne podczas pracy w systemie Windows.

C:/projects/a_project/some_file.rb'.gsub('/', '\\') działa urok. (To ma być podwójny ukośnik odwrotny - edytor traktuje to jako ucieczkę nawet w pojedynczych cudzysłowach).

Użyj czegoś podobnego tuż przed wysłaniem ciągu znaków, aby nazwa ścieżki nie była kontrolowana przez Ruby.

Musisz upewnić się, że twój program wie, w jakim systemie działa, aby mógł zdecydować, kiedy to będzie potrzebne. Jednym ze sposobów jest ustawić stałą na początku przebiegu programu, coś jak ten

::USING_WINDOWS = !!((RUBY_PLATFORM =~ /(win|w)(32|64)$/) || (RUBY_PLATFORM=~ /mswin|mingw/))

(wiem, że to działa, ale ja nie napisałem, że tak nie rozumiem podwójne huk .. .)

+2

Wierzę, że '!!' zamienia go na wartość logiczną. W ruby ​​true zwykle zwracane są obiekty niezerowe lub niefałszowane (w twoim przypadku otrzymasz obiekt Match). '!' konwertuje obiekt na 'false', a drugi'! 'zamienia go na' true'. –

0

Tak, denerwujące jest to, że użytkownicy systemu Windows nadal zamieniają ukośniki na ukośniki i na odwrót, jeśli potrzebujesz ścieżki do skopiowania do menedżera plików, więc robię to tak jak on. Nie szkodzi, jeśli korzystasz z systemu Linux lub Mac i oszczędza wiele niedogodności w oknach.