带有O_CREATE标志的os.OpenFile不会抛出这样的文件或目录

时间:2016-06-25 22:39:54

标签: go

我试图使用os.OpenFile函数打开os包的日志文件,如果这样的文件不存在,应该使用正确的标志创建文件。但它返回非零错误:没有这样的文件或目录。顺便说一下,我使用的是linux并且去了1.6。日志文件打开发生在init函数中。继承我的代码:

package main

import (
    "encoding/json"
    "fmt"
    "log"
    "net/http"
    "os"

    "github.com/gorilla/mux"
    "github.com/gorilla/sessions"
)

// Structs holds server configuration data from config json.
type serverConfiguration struct {
    port                    string
    logFileName             string
    sessionStorePhrase      string
    resourceFilesPath       string
    resourceFilesPathPrefix string
}

// Server global variables.
var (
    serverConfig serverConfiguration
    logFile      *os.File
    router       *mux.Router
    sessionStore *sessions.CookieStore
)

func init() {
    // temporary variables.
    var (
        configFile                                   *os.File
        serverConfErr, configDecodingErr, logFileErr error
    )

    // Loads json config file.
    configFile, serverConfErr = os.Open("server-conf.json")
    defer configFile.Close()

    if serverConfErr != nil {
        log.Fatal("SERVER-CONFIG-ERROR: ", serverConfErr)
    }

    // Decodes json to serverConfig struct.
    decoder := json.NewDecoder(configFile)
    serverConfig = serverConfiguration{}
    configDecodingErr = decoder.Decode(&serverConfig)

    if configDecodingErr != nil {
        log.Fatal("CONFIGURATION-DECODING-ERROR: ", configDecodingErr)
    }

    // Opens log file in app root directory.
    logFile, logFileErr = os.OpenFile(serverConfig.logFileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)

    if logFileErr != nil {
        log.Fatal("LOG-FILE-ERROR: ", logFileErr)
    }

    // Creates session store.
    sessionStore = sessions.NewCookieStore([]byte(serverConfig.sessionStorePhrase))
}

// Home page handler.
func homePageHandler(writer http.ResponseWriter, request *http.Request) {
    fmt.Fprint(writer, "asdasdasdasd")
}

func main() {
    defer logFile.Close()
    router = mux.NewRouter().StrictSlash(false)
    resourceFileServer := http.FileServer(http.Dir(serverConfig.resourceFilesPath))
    router.PathPrefix(serverConfig.resourceFilesPathPrefix).Handler(http.StripPrefix(serverConfig.resourceFilesPathPrefix, resourceFileServer))

    router.HandleFunc("/", homePageHandler)

    server := &http.Server{
        Addr:    serverConfig.port,
        Handler: router,
    }

    log.Println("Server listening on port ", serverConfig.port)
    server.ListenAndServe()
}

2 个答案:

答案 0 :(得分:0)

错误很可能是您要创建文件的路径不存在。如果它们不存在,它将创建日志文件,但不创建父目录。 要创建必要的目录结构,可以使用os.MkdirAll

答案 1 :(得分:0)

问题是json serverConfiguration没有值,因为它没有导出它需要像这样:

// ServerConfiguration structs holds server configuration data from config json.
type ServerConfiguration struct {
    Port                    string `json:"port"`
    LogFileName             string `json:"logFileName"`
    SessionStorePhrase      string `json:"sessionStorePhrase"`
    ResourceFilesPath       string `json:"resourceFilesPath"`
    ResourceFilesPathPrefix string `json:"resourceFilesPathPrefix"`
}