X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=tmp.go;h=70d3f1123840718924d05f4817cdabdcf6034aa6;hb=b2c61aa43c08395b0d38fd6def46f369e0366e9b;hp=876e23d8502bc3690bff9e99bc0523859420f64f;hpb=2b83ac5db8551f70614672b2d326272b35d064d3;p=gocheese.git diff --git a/tmp.go b/tmp.go index 876e23d..70d3f11 100644 --- a/tmp.go +++ b/tmp.go @@ -30,3 +30,38 @@ func TempFile(dir string) (*os.File, error) { name := filepath.Join(dir, "nncp"+suffix) return os.OpenFile(name, os.O_RDWR|os.O_CREATE|os.O_EXCL, os.FileMode(0666)) } + +func DirSync(dirPath string) error { + fd, err := os.Open(dirPath) + if err != nil { + return err + } + err = fd.Sync() + if err != nil { + fd.Close() + return err + } + return fd.Close() +} + +func WriteFileSync(dirPath, filePath string, data []byte) error { + dst, err := TempFile(dirPath) + if err != nil { + return err + } + if _, err = dst.Write(data); err != nil { + os.Remove(dst.Name()) + dst.Close() + return err + } + if err = dst.Sync(); err != nil { + os.Remove(dst.Name()) + dst.Close() + return err + } + dst.Close() + if err = os.Rename(dst.Name(), filePath); err != nil { + return err + } + return DirSync(dirPath) +}