MCPcopy Index your code
hub / github.com/1Panel-dev/1Panel / ReadFileByLine

Function ReadFileByLine

agent/utils/files/utils.go:187–293  ·  view source on GitHub ↗
(filename string, page, pageSize int, latest bool)

Source from the content-addressed store, hash-verified

185}
186
187func ReadFileByLine(filename string, page, pageSize int, latest bool) (res *dto.LogFileRes, err error) {
188 if !NewFileOp().Stat(filename) {
189 return
190 }
191 if pageSize <= 0 {
192 err = fmt.Errorf("pageSize must be positive")
193 return
194 }
195 file, err := os.Open(filename)
196 if err != nil {
197 return
198 }
199 defer file.Close()
200
201 fi, err := file.Stat()
202 if err != nil {
203 return
204 }
205
206 if fi.Size() > MaxReadFileSize {
207 err = buserr.New("ErrLogFileToLarge")
208 return
209 }
210
211 res = &dto.LogFileRes{}
212 reader := readerPool.Get().(*bufio.Reader)
213 reader.Reset(file)
214 defer readerPool.Put(reader)
215
216 if latest {
217 ringBuf := make([]string, pageSize)
218 writeIdx := 0
219 totalLines := 0
220
221 for {
222 line, readErr := readLineTrimmed(reader)
223 if readErr == io.EOF {
224 break
225 }
226 if readErr != nil {
227 err = readErr
228 return
229 }
230 ringBuf[writeIdx%pageSize] = line
231 writeIdx++
232 totalLines++
233 }
234
235 if totalLines == 0 {
236 res.Lines = []string{}
237 res.TotalLines = 0
238 res.TotalPages = 0
239 res.IsEndOfFile = true
240 return
241 }
242
243 total := (totalLines + pageSize - 1) / pageSize
244 res.TotalPages = total

Callers

nothing calls this directly

Calls 7

NewFileOpFunction · 0.85
readLineTrimmedFunction · 0.85
CloseMethod · 0.65
SizeMethod · 0.65
GetMethod · 0.65
StatMethod · 0.45
ResetMethod · 0.45

Tested by

no test coverage detected