WriteFile writes data to filename+some suffix, then renames it into filename. The perm argument is ignored on Windows, but if the target filename already exists then the target file's attributes and ACLs are preserved. If the target filename already exists but is not a regular file, WriteFile return
(filename string, data []byte, perm os.FileMode)
| 19 | // exists then the target file's attributes and ACLs are preserved. If the target |
| 20 | // filename already exists but is not a regular file, WriteFile returns an error. |
| 21 | func WriteFile(filename string, data []byte, perm os.FileMode) (err error) { |
| 22 | fi, err := os.Stat(filename) |
| 23 | if err == nil && !fi.Mode().IsRegular() { |
| 24 | return fmt.Errorf("%s already exists and is not a regular file", filename) |
| 25 | } |
| 26 | f, err := os.CreateTemp(filepath.Dir(filename), filepath.Base(filename)+".tmp") |
| 27 | if err != nil { |
| 28 | return err |
| 29 | } |
| 30 | tmpName := f.Name() |
| 31 | defer func() { |
| 32 | if err != nil { |
| 33 | f.Close() |
| 34 | os.Remove(tmpName) |
| 35 | } |
| 36 | }() |
| 37 | if _, err := f.Write(data); err != nil { |
| 38 | return err |
| 39 | } |
| 40 | if runtime.GOOS != "windows" { |
| 41 | if err := f.Chmod(perm); err != nil { |
| 42 | return err |
| 43 | } |
| 44 | } |
| 45 | if err := f.Sync(); err != nil { |
| 46 | return err |
| 47 | } |
| 48 | if err := f.Close(); err != nil { |
| 49 | return err |
| 50 | } |
| 51 | return Rename(tmpName, filename) |
| 52 | } |
| 53 | |
| 54 | // Rename srcFile to dstFile, similar to [os.Rename] but preserving file |
| 55 | // attributes and ACLs on Windows. |
searching dependent graphs…