File 覆盖文件内容时出现问题
我无法用零覆盖文件内容。问题是原始文件的最后一个字节仍然存在,即使我超出了它的大小100字节。有人知道我错过了什么吗File 覆盖文件内容时出现问题,file,go,overwrite,File,Go,Overwrite,我无法用零覆盖文件内容。问题是原始文件的最后一个字节仍然存在,即使我超出了它的大小100字节。有人知道我错过了什么吗 func (h PostKey) ServeHTTP(w http.ResponseWriter, r *http.Request) { f, err := os.Create("received.dat") if err != nil { w.WriteHeader(http.StatusInternalServerError)
func (h PostKey) ServeHTTP(w http.ResponseWriter, r *http.Request) {
f, err := os.Create("received.dat")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
defer f.Close()
_, err = io.Copy(f, r.Body)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
return
}
// Retrieve filesize
size, _ := f.Seek(0, 1)
zeroFilled := make([]byte, size + 100)
n, err := f.WriteAt(zeroFilled, 0)
if err != nil {
return
}
fmt.Printf("Size: %d\n", size) // prints 13
fmt.Printf("Bytes written: %d\n", n) // prints 113
}
出现此问题的原因可能是数据写入http处理程序内的同一文件(共享资源),并且处理程序本身可能会并发执行。您需要在数据序列化(覆盖过程)期间锁定对文件的访问。快速解决方案将是:
import (
"sync"
//... other packages
)
var muFile sync.Mutex
func (h PostKey) ServeHTTP(w http.ResponseWriter, r *http.Request) {
muFile.Lock()
defer muFile.Unlock()
f, err := os.Create("received.dat")
//other statements
//...
}
如果您的服务器负载较低,上述解决方案就可以了。但是,如果您的服务器需要同时处理大量请求,则需要使用不同的方法(尽管规则相同,但锁定对任何共享资源的访问) 我正在写入文件,并试图在相同的上下文中覆盖它,因此第一次写入操作的某些部分仍在内存中,尚未写入磁盘。通过使用
f.Sync()
在复制正文内容后刷新所有内容,我能够解决问题。您是否可以共享正文内容?最后一个没有被覆盖的字节是什么?使用你的代码,我似乎无法重现你的问题。您没有提供代码来重现问题。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。