+
+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)
+}