Skip to content

Commit d613f3f

Browse files
committed
Add fileio sync and close example
1 parent 2f172d0 commit d613f3f

File tree

3 files changed

+124
-0
lines changed

3 files changed

+124
-0
lines changed

examples/basic/fileio/examples.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/devlights/try-golang/examples/basic/fileio/readwrite"
77
"github.com/devlights/try-golang/examples/basic/fileio/stat"
88
"github.com/devlights/try-golang/examples/basic/fileio/stdinouterr"
9+
"github.com/devlights/try-golang/examples/basic/fileio/sync_and_close"
910
"github.com/devlights/try-golang/mapping"
1011
)
1112

@@ -25,4 +26,5 @@ func (r *register) Regist(m mapping.ExampleMapping) {
2526
stdinouterr.NewRegister().Regist(m)
2627
filesystem.NewRegister().Regist(m)
2728
ja.NewRegister().Regist(m)
29+
sync_and_close.NewRegister().Regist(m)
2830
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package sync_and_close
2+
3+
import "github.com/devlights/try-golang/mapping"
4+
5+
type (
6+
register struct{}
7+
)
8+
9+
var (
10+
_ mapping.Register = (*register)(nil)
11+
)
12+
13+
// NewRegister -- このパッケージ用のサンプルを登録する mapping.Register を生成します。
14+
func NewRegister() mapping.Register {
15+
return new(register)
16+
}
17+
18+
// Regist -- 登録します.
19+
func (r *register) Regist(m mapping.ExampleMapping) {
20+
m["fileio_sync_and_close"] = SyncAndClose
21+
}
Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package sync_and_close
2+
3+
import (
4+
"os"
5+
6+
"github.com/devlights/gomy/output"
7+
)
8+
9+
// SyncAndClose は、ファイルを扱う際にクローズする前にSyncしてからCloseするサンプルです.
10+
//
11+
// # REFERENCES
12+
// - https://pkg.go.dev/os@go1.20.4#File.Sync
13+
// - https://pkg.go.dev/os@go1.20.4#File.Close
14+
// - https://yasukata.hatenablog.com/entry/2020/06/24/072609
15+
// - https://yasukata.hatenablog.com/entry/2020/06/23/031622
16+
func SyncAndClose() error {
17+
//
18+
// ファイルに書き込む際、通常はCloseの呼び出しをdeferで書いて
19+
// エラー処理を省略してしまうことが多いが、ちゃんとファイルに書き出せたか
20+
// どうかを判定する場合は Sync() を呼び出す方が良い。
21+
// Sync() は、内部でシステムコール fsync の呼び出しを行う。
22+
//
23+
24+
//
25+
// Write
26+
//
27+
var (
28+
fpath string
29+
err error
30+
)
31+
32+
fpath, err = write()
33+
if err != nil {
34+
return err
35+
}
36+
defer os.Remove(fpath)
37+
38+
//
39+
// Read
40+
//
41+
var (
42+
data []byte
43+
)
44+
45+
data, err = read(fpath)
46+
if err != nil {
47+
return err
48+
}
49+
50+
output.Stdoutl("[Data]", string(data))
51+
52+
return nil
53+
}
54+
55+
func write() (string, error) {
56+
// Create
57+
var (
58+
file *os.File
59+
err error
60+
)
61+
62+
file, err = os.CreateTemp(os.TempDir(), "trygolang-")
63+
if err != nil {
64+
return "", err
65+
}
66+
defer file.Close()
67+
68+
// Write
69+
var (
70+
buf = []byte("hello world")
71+
)
72+
73+
_, err = file.Write(buf)
74+
if err != nil {
75+
return "", err
76+
}
77+
78+
// Sync (Flush)
79+
// - https://yasukata.hatenablog.com/entry/2020/06/24/072609
80+
err = file.Sync()
81+
if err != nil {
82+
return file.Name(), err
83+
}
84+
85+
return file.Name(), nil
86+
}
87+
88+
func read(fpath string) ([]byte, error) {
89+
// Read
90+
var (
91+
data []byte
92+
err error
93+
)
94+
95+
data, err = os.ReadFile(fpath)
96+
if err != nil {
97+
return nil, err
98+
}
99+
100+
return data, nil
101+
}

0 commit comments

Comments
 (0)