首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Go中验证文件是否有要从ioutil.ReadFile封送的内容

如何在Go中验证文件是否有要从ioutil.ReadFile封送的内容
EN

Stack Overflow用户
提问于 2016-04-18 09:19:41
回答 2查看 415关注 0票数 0

我正在尝试使用文件而不是DB来启动和运行原型。我有一个程序,它(1)将现有内容从文件读取到映射中,(2)获取将内容添加到映射中的JSON POSTs,(3)在退出时写入文件。

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

代码语言:javascript
复制
  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()

}
EN

回答 2

Stack Overflow用户

发布于 2016-04-18 09:59:04

服务器永远不可能到达defer writeDB()

http.ListenAndServe块,如果它确实返回了任何东西,您可以log.Fatal它,这将在此时退出您的应用程序。

你不能拦截应用程序退出的所有方式,比如SIGKILL、机器断电等。

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

如果是这样,那么Ctrl-C就足够好了。

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

此外,在函数的最后一行延迟实际上没有任何意义,因为延迟基本上意味着“最后做这件事”。

票数 1
EN

Stack Overflow用户

发布于 2016-04-18 09:25:43

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

代码语言:javascript
复制
   file, err := os.Open( filepath ) 
    if err != nil {
        // handle error
    }

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

   s := fi.Size()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36684061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档