使用文件方案读取URL作为ReadFile文件名的惯用方法是什么?

时间:2017-05-31 20:45:00

标签: go

是否有一种惯用的方法从系统(文件方案)网址开始从系统读取文件而不是路径?

我先试了这个:

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

这是我目前的(主要是工作版本),但我担心有一些我遗失的陷阱,所以我希望有一种更有效的方法来实现它:

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

(如果我可以同时支持file:///Users/jdoe/temp.jsonfile:///c:/WINDOWS/clock.json而不必添加代码路径,则可以获得奖励)

1 个答案:

答案 0 :(得分:1)

使用net/url(您正在使用的解决方案)是正确的。

它可以正确处理跨平台的主机名和路径,还使您有机会检查url方案是否为文件方案。

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)
    }
}