gpt4 book ai didi

go - 截断打开的 os.File(拒绝访问)

转载 作者:IT王子 更新时间:2023-10-29 02:16:56 28 4
gpt4 key购买 nike

我有很多记录器写入我的应用程序中的不同文件。我正在尝试添加在应用程序运行时截断该文件的功能。这是我的:

type Resource struct {
Logger *ResourceLogger
// other stuff pertaining to my resource...
}

func (r *Resource) SetLogger(logPath string) {
path := logPath + r.Name + ".log"
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Unable to open log file '%v'", path)
}
r.Logger = &ResourceLogger{log.New(f, "", log.Ldate|log.Ltime), f}
}

type ResourceLogger struct {
*log.Logger
LogFile *os.File
}

这让我可以轻松地记录到许多文件,每个资源一个。但是,当我尝试使用 Resource.Logger.LogFile.Truncate(0) 时,出现拒绝访问错误。

最佳答案

我认为您是在 Windows 上工作,因为 Windows 有这样锁定文件的习惯。我建议,由于您基本上可以控制日志写入和截断,因此您可以暂时关闭文件,然后在没有打开的文件句柄时截断它。

例如,您必须使用互斥锁来阻止任何人在截断时尝试记录任何内容,并且在完成后只需重新打开日志文件进行写入。这是一个粗略的例子:

package main

import (
"log"
"os"
"sync"
)

type Resource struct {
Logger *ResourceLogger
// other stuff pertaining to my resource...
Name string
}

func (r *Resource) SetLogger(logPath string) {
path := logPath + r.Name + ".log"
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Unable to open log file '%v'", path)
}
r.Logger = &ResourceLogger{log.New(f, "", log.Ldate|log.Ltime), f, path, sync.Mutex{}}
}

func (r *ResourceLogger) Truncate() {
if r.logger != nil {
r.logmutex.Lock()
r.logfile.Close()
os.Truncate(r.logfilename, 0) // The file must not be open on Windows!
f, err := os.OpenFile(r.logfilename, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
if err != nil {
log.Fatalf("Unable to open log file '%v'", r.logfilename)
}
r.logger = log.New(f, "", log.Ldate|log.Ltime)
r.logfile = f
r.logmutex.Unlock()
}
}

type ResourceLogger struct {
logger *log.Logger
logfile *os.File
logfilename string
logmutex sync.Mutex
}

func (r *ResourceLogger) Println(s string) {
r.logmutex.Lock()
r.logger.Println(s)
r.logmutex.Unlock()
}

func main() {
r := Resource{}
r.Name = "jeejee"
r.SetLogger("")

r.Logger.Println("test one")
for {
r.Logger.Println("more logging")
r.Logger.Truncate()
}
}

关于go - 截断打开的 os.File(拒绝访问),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25534857/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com