2011-08-24 39 views
13

Voglio scrivere un'applicazione che funzioni in windows e linux. ma ho un problema di percorso perché Windows usa "\" e Linux usa "/". Come posso risolvere questo problema. graziebarra e barra rovesciata in Ruby

risposta

17

In Ruby, non v'è alcuna differenza tra i percorsi in Linux o Windows. Il percorso dovrebbe utilizzare / indipendentemente dall'ambiente. Pertanto, per utilizzare qualsiasi percorso in Windows, sostituire tutto \ con /. File#join funzionerà sia per Windows che per Linux. Ad esempio, in 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 se questo ha funzionato solo quando si desidera eseguire comandi esterni. – Automatico

+0

... non vero, in windows ci sono prefissi speciali come \\? \ (Richiesto per i percorsi> 260bytes) che vengono convertiti in //?/Che non hanno alcun significato ... Quindi la funzione è davvero un bug afaict – estani

+0

@estani Non ho detto che è una funzionalità. Ho detto 'File.join' e tutti i percorsi sono separati da/a prescindere dall'ambiente.Ecco come i percorsi sono rappresentati in ruby ​​e devi usare '/' anche in caso di Windows per i percorsi dei file durante l'inizializzazione di un file. – rubyprince

7

Utilizzare la classe Pathname per generare percorsi che poi saranno corretti sul sistema:

a_path = Pathname.new("a_path_goes_here") 

Il vantaggio di questo è che vi permetterà di directory chain, utilizzando l'operatore di +:

a_path + "another_path" + "and another" 

Calling a_path.to_s sarà quindi generare il percorso corretto per il sistema che si sta percorrendo.

+2

Non dimenticare di richiedere "pathname" a meno che tu non stia girando su un ginormous framework di sviluppo web. –

+0

Questo non funziona per Ruby 2.0.0 su Windows a meno che manchi qualcosa: p = Pathname.new ("") p = p + "mela" + "banana" mette p.to_s <- "mela/banana" –

+0

Usa File.join invece, è più semplice e meno fastidioso del percorso - e funzionerà perfettamente. – shevy

6

Finché Rubino sta facendo il lavoro, / in nomi di percorso è ok su Windows

volta è necessario inviare un percorso per qualche altro programma da utilizzare, soprattutto in una riga di comando o di qualcosa di simile a un caricamento di file in un browser, devi convertire le barre in barre retroverse quando sei in esecuzione in Windows.

C:/projects/a_project/some_file.rb'.gsub('/', '\\') funziona un fascino. (Questo dovrebbe essere un doppio backslash - questo editor lo vede come una fuga anche tra virgolette singole.)

Utilizzare qualcosa del genere appena prima di inviare la stringa per il nome del percorso fuori dal controllo di Ruby.

È necessario accertarsi che il programma conosca il sistema operativo in uso in modo che possa decidere quando è necessario. Un modo è quello di impostare una costante all'inizio del l'esecuzione del programma, qualcosa di simile

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

(So che questo funziona, ma non l'ho scritto in modo non capisco il doppio botto .. .)

+2

Credo che il '!!' lo converta in un booleano. In ruby ​​true viene in genere restituito come oggetto non nullo o non falso (nel caso si otterrà un oggetto Match). '!' converte l'oggetto in 'false' e ​​il secondo'! 'lo converte in' true'. –

0

Sì, è fastidioso come utenti di Windows continuare a sostituire le barre inverse con le barre e viceversa se è necessario il percorso per copiarlo nel filemanager, quindi lo faccio come il suo. Non fa male se si è su Linux o Mac e si risparmia un sacco di fastidi in Windows.

path = 'I:\ebooks\dutch\_verdelen\Komma'.gsub(/\\/,'/') 

Dir.glob("#{path}/**/*.epub").each do |file| 
    puts file 
end 
Problemi correlati