4 votes

Quelle est la manière idiomatique de lire les urls avec un schéma de fichier en tant que noms de fichiers pour ReadFile ?

Existe-t-il un moyen idiomatique de lire un fichier sur le système à partir d'une url (schéma de fichier) et non d'un chemin d'accès ?

J'ai d'abord essayé ceci :

fileUrlStr := "file:///path/to/file.json"
jsonBuffer, _ := ioutil.ReadFile(fileUrlStr)

C'est ma version actuelle (qui fonctionne pour l'essentiel), mais je crains qu'il y ait des problèmes que je n'ai pas résolus, et j'espère donc qu'il existe une méthode plus éprouvée pour y parvenir :

fileUrlStr := "file:///path/to/file.json"
fileUrl, _ := url.Parse(fileUrlStr)
jsonBuffer, _ := ioutil.ReadFile(fileUrl.Path)

(Bonus si je peux soutenir les deux file:///Users/jdoe/temp.json y file:///c:/WINDOWS/clock.json sans avoir à ajouter des chemins de code les prenant en compte)

1voto

Liyan Chang Points 1926

Utilisation net/url La solution que vous avez utilisée est donc la bonne.

Il traite correctement les noms d'hôtes et les chemins d'accès sur toutes les plates-formes et vous permet également de vérifier que le schéma d'url correspond au schéma de fichier.

package main

import (
    "fmt"
    "net/url"
)

func main() {

    for _, path := range []string{
        "file:///path/to/file.json",
        "file:///c:/WINDOWS/clock.json",
        "file://localhost/path/to/file.json",
        "file://localhost/c:/WINDOWS/clock.avi",

        // A case that you probably don't need to handle given the rarity,
        // but is a known legacy win32 issue when translating \\remotehost\share\dir\file.txt 
        "file:////remotehost/share/dir/file.txt",

    } {
        u, _ := url.ParseRequestURI(path)
        fmt.Printf("url:%v\nscheme:%v host:%v Path:%v\n\n", u, u.Scheme, u.Host, u.Path)
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X