2011-08-24 16 views

Respuesta

17

En Ruby, no hay diferencia entre los caminos en Linux o Windows. La ruta debe estar usando / independientemente del entorno. Por lo tanto, para usar cualquier ruta en Windows, reemplace todo \ con /. File#join funcionará para Windows y Linux. Por ejemplo, en 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 si esto solo funcionó cuando desea ejecutar comandos externos. – Automatico

+0

... no es cierto, en las ventanas hay prefijos especiales como \\? \ (Requerido para rutas> 260bytes) que se convierten a //?/Que no tienen ningún significado ... Así que la función es de hecho un bug afaict – estani

+0

@estani No he dicho que sea una característica. Dije 'File.join' y de hecho todas las rutas están separadas por'/'independientemente del entorno.Así es como se representan los caminos en ruby ​​y tiene que usar '/' incluso en el caso de Windows para rutas de archivos al inicializar un archivo. – rubyprince

7

Utilice la clase Pathname para generar caminos que luego será correcta en su sistema:

a_path = Pathname.new("a_path_goes_here") 

El beneficio de esto es que le permitirá a los directorios de la cadena de utilizando el operador +:

a_path + "another_path" + "and another" 

Calling a_path.to_s generará entonces el camino correcto para el sistema que se encuentra.

+2

No olvides requerir "nombre de ruta" a menos que estés ejecutando en un marco de desarrollo web descomunal. –

+0

Esto no funciona para Ruby 2.0.0 en Windows a menos que me falta algo: p = Pathname.new ("") p = p + "apple" + "banana" puts p.to_s <- "apple/banana" –

+0

Use File.join en su lugar, es más simple y menos molesto que pathname, y funcionará perfectamente. – shevy

6

Mientras Rubí está haciendo el trabajo, / en los nombres de ruta está bien en Windows

Una vez que usted tiene que enviar un camino para algún otro programa para utilizar, sobre todo en una línea de comandos o algo así como una carga de archivos en un navegador, debe convertir las barras diagonales en barras invertidas cuando se ejecuta en Windows.

C:/projects/a_project/some_file.rb'.gsub('/', '\\') trabaja a charm. (Se supone que es una doble barra diagonal inversa: este editor lo ve como un escape incluso en comillas simples).

Use algo como esto justo antes de enviar la cadena para el nombre de la ruta fuera del control de Ruby.

Deberá asegurarse de que su programa sepa en qué sistema operativo se está ejecutando para que pueda decidir cuándo es necesario. Una forma es establecer una constante en el comienzo de la ejecución del programa, algo como esto

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

(Sé que esto funciona, pero no escribí, así que no entiendo la doble explosión .. .)

+2

Creo que '!!' lo convierte en un booleano. En ruby ​​true generalmente se devuelve como objetos no nulos o no falsos (obtendría un objeto Match en su caso). '!' convierte el objeto en 'falso' y el segundo'! 'lo convierte en' true'. –

0

Sí, es molesto que los usuarios de Windows sigan reemplazando esas barras invertidas por barras diagonales y viceversa si necesita la ruta para copiarlo a su administrador de archivos, así que lo hago como el suyo. No hace daño si está en Linux o Mac y ahorra muchas molestias en Windows.

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

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