OnlineLibrary

Форк
0
/
securefile.go 
54 строки · 956.0 Байт
1
package util
2

3
import (
4
	"os"
5
	"path/filepath"
6
)
7

8
const tmp_suffix = ".tmp"
9

10
type SecureFile struct {
11
	path      string
12
	corrupted bool
13
	f         *os.File
14
}
15

16
func CreateSecureFile(path string) (*SecureFile, error) {
17
	if err := os.MkdirAll(filepath.Dir(path), os.ModeDir); err != nil {
18
		return nil, err
19
	}
20

21
	f, err := os.Create(path + tmp_suffix)
22
	if err != nil {
23
		return nil, err
24
	}
25

26
	sf := new(SecureFile)
27
	sf.path = path
28
	sf.f = f
29
	return sf, nil
30
}
31

32
func (sf *SecureFile) Write(p []byte) (int, error) {
33
	n, err := sf.f.Write(p)
34
	if err != nil {
35
		sf.corrupted = true
36
	}
37
	return n, err
38
}
39

40
func (sf *SecureFile) Corrupted() {
41
	sf.corrupted = true
42
}
43

44
func (sf *SecureFile) Close() error {
45
	err := sf.f.Close()
46
	tmp_path := sf.f.Name()
47
	if sf.corrupted || err != nil {
48
		// Temporary file is corrupted. Trying to remove it
49
		os.Remove(tmp_path)
50
		return err
51
	}
52
	// Just replace the original file with a temporary one
53
	return os.Rename(tmp_path, sf.path)
54
}
55

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.