OnlineLibrary
54 строки · 956.0 Байт
1package util
2
3import (
4"os"
5"path/filepath"
6)
7
8const tmp_suffix = ".tmp"
9
10type SecureFile struct {
11path string
12corrupted bool
13f *os.File
14}
15
16func CreateSecureFile(path string) (*SecureFile, error) {
17if err := os.MkdirAll(filepath.Dir(path), os.ModeDir); err != nil {
18return nil, err
19}
20
21f, err := os.Create(path + tmp_suffix)
22if err != nil {
23return nil, err
24}
25
26sf := new(SecureFile)
27sf.path = path
28sf.f = f
29return sf, nil
30}
31
32func (sf *SecureFile) Write(p []byte) (int, error) {
33n, err := sf.f.Write(p)
34if err != nil {
35sf.corrupted = true
36}
37return n, err
38}
39
40func (sf *SecureFile) Corrupted() {
41sf.corrupted = true
42}
43
44func (sf *SecureFile) Close() error {
45err := sf.f.Close()
46tmp_path := sf.f.Name()
47if sf.corrupted || err != nil {
48// Temporary file is corrupted. Trying to remove it
49os.Remove(tmp_path)
50return err
51}
52// Just replace the original file with a temporary one
53return os.Rename(tmp_path, sf.path)
54}
55