如何验证文件是否包含来自Go中的ioutil.ReadFile的内容

时间:2016-04-18 01:19:41

标签: file go io

我正在尝试使用文件而不是数据库来启动并运行原型。我有一个程序,(1)从文件中读取现有内容到地图,(2)接受向地图添加内容的JSON POST,(3)退出时,写入文件。

首先,没有创建文件。然后我创建了一个空文件。它没有被写入。 我正在尝试读取文件,确定是否存在现有内容。如果没有现有内容,请创建空白地图。如果存在现有内容,请将其解组为新地图。

  func writeDB() {
    eventDBJSON, err := json.Marshal(eventDB)
    if err != nil {
        panic(err)
    }

    err2 := ioutil.WriteFile("/Users/sarah/go/dat.txt", eventDBJSON, 0777)
    if err2 != nil {
        panic(err2)
    }
}

func main() {

    dat, err := ioutil.ReadFile("/Users/sarah/go/dat.txt")
    if err != nil {
        panic(err)
    }
    if dat == nil {
        eventDB = DB{
            events: map[string]event{},
        }
    } else {
        if err2 := json.Unmarshal(dat, &eventDB); err2 != nil {
            panic(err2)
        }
    }

    router := httprouter.New()
    router.POST("/join", JoinEvent)
    router.POST("/create", CreateEvent)

    log.Fatal(http.ListenAndServe(":8080", router))

    defer writeDB()

}

2 个答案:

答案 0 :(得分:1)

服务器无法覆盖defer writeDB()

http.ListenAndServe阻止,如果它确实返回了任何内容,那么你log.Fatal会在那时退出你的app。

你不能拦截应用程序可以退出的所有方式,获取SIGKILL,机器断电等等。

我假设你真的只想写一些代码,反弹服务器,重复

如果是这种情况,那么Ctrl-C就足够了。

如果您想在Ctrl-C上编写文件,请查看signal包。

另外,推迟函数的最后一行实际上没有任何目的,因为延迟基本上意味着“做最后一次”。

答案 1 :(得分:0)

您可以使用(*os.File).Stat()获取包含其大小的文件FileInfo

   file, err := os.Open( filepath ) 
    if err != nil {
        // handle error
    }

    fi, err := file.Stat()
    if err != nil {
      // handle error
    }

   s := fi.Size()