Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 覆盖文件内容时出现问题_File_Go_Overwrite - Fatal编程技术网

File 覆盖文件内容时出现问题

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)

我无法用零覆盖文件内容。问题是原始文件的最后一个字节仍然存在,即使我超出了它的大小100字节。有人知道我错过了什么吗

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()
在复制正文内容后刷新所有内容,我能够解决问题。

您是否可以共享正文内容?最后一个没有被覆盖的字节是什么?使用你的代码,我似乎无法重现你的问题。您没有提供代码来重现问题。寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。