/
workfile.go
executable file
·146 lines (130 loc) · 4.57 KB
/
workfile.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package agent
import (
"bufio"
"fmt"
"os"
"path/filepath"
"strconv"
// log "github.com/sirupsen/logrus"
)
const (
initialTokenSize = 4096
maxTokenSize = 500 * 1024 // scanner.Err()でエラーになる場合、ここの数字を増やす
)
// GetWorkfilePath はファイル名が'_'で始まる場合は共有ディレクトリ下のパスを、
// そうでない場合はローカルディレクトリ下のパスを返します。
func (config Config) GetWorkfilePath(filename string) string {
workDir := config.WorkDir
if filename[0] == '_' {
workDir = config.WorkCommonDir
}
workPath := filepath.Join(workDir, filename)
return workPath
}
func (config Config) GetArchivefilePath(filename string) string {
return filepath.Join(config.ArchiveDir, filename)
}
// ReadFile はファイルを指定した行数分読み込みます。
func ReadFileHead(filename string, maxRow int) ([]string, error) {
var lines []string
file, err := os.Open(filename)
if err != nil {
return lines, fmt.Errorf("read work file %s : %s", filename, err)
}
defer file.Close()
scanner := bufio.NewScanner(file)
buf := make([]byte, initialTokenSize)
//bufのサイズが足りなかった場合、maxTokenSizeまでバッファを拡大してスキャンする
scanner.Buffer(buf, maxTokenSize)
row := 0
for scanner.Scan() {
row++
if maxRow != 0 && row > maxRow { // maxRowが0の場合は全行読み込み
break
}
lines = append(lines, scanner.Text())
}
// bufferが足りなかった場合などは、scanner.Err()でエラーを検出
err = scanner.Err()
if err != nil {
return nil, fmt.Errorf("read work file %s : %s", filename, err)
}
return lines, nil
}
// ReadWorkFile はワークファイルを指定した行数分読み込みます。
func (config Config) ReadWorkFileHead(filename string, maxRow int) ([]string, error) {
return ReadFileHead(config.GetWorkfilePath(filename), maxRow)
}
// ReadWorkFile はワークファイルを全行読み込みます。
func (config Config) ReadWorkFile(filename string) ([]string, error) {
return config.ReadWorkFileHead(filename, 0)
}
// WriteWorkFile はークファイルの書き込みをします。
func (config Config) WriteWorkFile(filename string, lines []string) error {
file, err := os.Create(config.GetWorkfilePath(filename))
if err != nil {
return fmt.Errorf("write work file %s: %s", filename, err)
}
defer file.Close()
for _, line := range lines {
_, err := file.WriteString(line + "\n")
if err != nil {
return fmt.Errorf("write work file %s: %s", filename, err)
}
}
return nil
}
func (config Config) WriteLineWorkFile(filename, line string) error {
return config.WriteWorkFile(filename, []string{line})
}
// ReadWorkFileNumber はワークファイルから数値を読み込みます。
func (config Config) ReadWorkFileNumber(filename string) (int, error) {
lines, err := config.ReadWorkFile(filename)
if err != nil {
return 0, fmt.Errorf("read work file number %s", err)
}
i, err2 := strconv.Atoi(lines[0])
if err2 != nil {
return 0, fmt.Errorf("read work file number %s", err2)
}
return i, nil
}
// WriteWorkFileNumber はワークファイルへの数値の書き込みます。
func (config Config) WriteWorkFileNumber(filename string, num int) error {
return config.WriteWorkFile(filename, []string{strconv.Itoa(num)})
}
// CheckWorkFile はワークファイルの確認の有無を確認します。
func (config Config) CheckWorkFile(filename string) (bool, error) {
_, err := os.Stat(config.GetWorkfilePath(filename))
if err == nil {
return true, nil
}
if os.IsNotExist(err) {
return false, nil
}
return false, err
}
// RemoveWorkFile はワークファイルの削除をします。
func (config Config) RemoveWorkFile(filename string) error {
filepath := config.GetWorkfilePath(filename)
_, err := os.Stat(filepath)
if err == nil {
if err2 := os.Remove(filepath); err2 != nil {
return err2
}
}
return nil
}
func (config Config) RemoveArchiveFile(filename string) error {
filepath := config.GetArchivefilePath(filename)
_, err := os.Stat(filepath)
if err == nil {
if err2 := os.Remove(filepath); err2 != nil {
return err2
}
}
return nil
}
func (config Config) ReadPid() (int, error) {
return config.ReadWorkFileNumber(config.PidFile)
}