|
|
|
@ -1,6 +1,7 @@
|
|
|
|
|
package core
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
"sort"
|
|
|
|
@ -11,46 +12,34 @@ import (
|
|
|
|
|
// OpenFile opens a file for reading (read-only, world-readable)
|
|
|
|
|
func OpenFile(p *Path) (*os.File, errors.Error) {
|
|
|
|
|
file, err := os.OpenFile(p.Absolute(), os.O_RDONLY, 0444)
|
|
|
|
|
return file, WrapIfError(ErrFileOpen, err)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, ErrFileOpen.Wrap(err)
|
|
|
|
|
}
|
|
|
|
|
return file, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// StatFile performs a file stat on a file at path
|
|
|
|
|
func StatFile(p *Path) (os.FileInfo, errors.Error) {
|
|
|
|
|
stat, err := os.Stat(p.Absolute())
|
|
|
|
|
return stat, WrapIfError(ErrFileStat, err)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, ErrFileStat.Wrap(err)
|
|
|
|
|
}
|
|
|
|
|
return stat, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ReadFile reads a supplied file descriptor into a return byte slice, or error
|
|
|
|
|
func ReadFile(file *os.File) ([]byte, errors.Error) {
|
|
|
|
|
// Return slice
|
|
|
|
|
ret := make([]byte, 0)
|
|
|
|
|
|
|
|
|
|
// Get read buffers, defer putting back
|
|
|
|
|
br := fileBufferedReaderPool.Get(file)
|
|
|
|
|
defer fileBufferedReaderPool.Put(br)
|
|
|
|
|
|
|
|
|
|
// Read through file until null bytes / error
|
|
|
|
|
for {
|
|
|
|
|
// Read line
|
|
|
|
|
line, err := br.ReadBytes('\n')
|
|
|
|
|
if err != nil {
|
|
|
|
|
if err == io.EOF {
|
|
|
|
|
// EOF, add current to return slice and
|
|
|
|
|
// break-out. WIll not have hit delim
|
|
|
|
|
ret = append(ret, line...)
|
|
|
|
|
break
|
|
|
|
|
} else {
|
|
|
|
|
// Bad error, return
|
|
|
|
|
return nil, ErrFileRead.Wrap(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add current line to return slice
|
|
|
|
|
ret = append(ret, line...)
|
|
|
|
|
// Read the file into new file buffer and try return this
|
|
|
|
|
buf := &bytes.Buffer{}
|
|
|
|
|
_, err := br.WriteTo(buf)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, ErrFileRead.Wrap(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Return!
|
|
|
|
|
return ret, nil
|
|
|
|
|
return buf.Bytes(), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ScanFile scans a supplied file at file descriptor, using iterator function
|
|
|
|
|