2012-08-26 16 views
6

Me gustaría utilizar path.Dir() en Unix y Windows con un directorio específico de la plataforma. Por favor, eche un vistazo al código:golang: vía de plataforma cruzada.Dir

package main 

import (
    "fmt" 
    "path" 
) 

func main() { 
    fmt.Println(`path.Dir("a/b/c"): `, path.Dir("a/b/c")) 
    fmt.Println(`path.Dir("c:\foo\bar.exe"): `, path.Dir(`c:\foo\bar.exe`)) 
} 

Esto da salida a

path.Dir("a/b/c"): a/b 
path.Dir("c:\foo\bar.exe"): . 

me gustaría llegar a la segunda llamada a path.Dir() (ventanas) algo así como

c:\foo 

¿Es posible decir path.dir() para utilizar separadores de Windows para mi programa que se ejecuta en Windows? ¿O debería convertir siempre las barras inversas \ en barras diagonales (/)? ¿Cuál es la estrategia preferida aquí?

Respuesta

10

Veo dónde está el "problema". This discussion at golang-nuts me dio la pista, que path.Dir() siempre usa / y filepath.Dir() es la función que se utilizará para la manipulación dependiente de la plataforma.

package main 

import (
    "fmt" 
    "path/filepath" 
) 

func main() { 
    fmt.Println(`filepath.Dir("a/b/c"): `, filepath.Dir("a/b/c")) 
    fmt.Println(`filepath.Dir("c:\foo\bar.exe"): `, filepath.Dir(`c:\foo\bar.exe`)) 
} 

en las ventanas:

filepath.Dir("a/b/c"): a\b 
filepath.Dir("c:\foo\bar.exe"): c:\foo 
+3

Vale la pena señalar que la visión general del paquete de 'camino' indica que es para las rutas de barra separada y 'ruta/ruta de archivo' es específica del SO. Además, si lo necesita, filepath.ToSlash() y filepath.FromSlash() se pueden usar para convertir desde y hacia barras separadas y específicas de os. –

+0

@RunningWild Buen consejo, gracias. Yo, como un hablante no nativo, asumí que "caminos separados por barras" puede significar ambos (barras invertidas y posteriores). Ahora sé mejor. – topskip