forked from mirror/pkger
harold's super service
This commit is contained in:
parent
b6440c5fec
commit
49d408c229
|
@ -250,22 +250,21 @@ func (s Suite) Test_Open_File(t *testing.T) {
|
||||||
|
|
||||||
body := "!" + pt.String()
|
body := "!" + pt.String()
|
||||||
|
|
||||||
f1, err := s.Create(tt.in)
|
pkgutil.WriteFile(s, tt.in, []byte(body), 0644)
|
||||||
|
|
||||||
|
f, err := s.Open(tt.in)
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
|
|
||||||
_, err = io.Copy(f1, strings.NewReader(body))
|
r.Equal(pt.Name, f.Path().Name)
|
||||||
r.NoError(err)
|
b, err := ioutil.ReadAll(f)
|
||||||
r.NoError(f1.Close())
|
|
||||||
|
|
||||||
f2, err := s.Open(tt.in)
|
|
||||||
r.NoError(err)
|
|
||||||
|
|
||||||
r.Equal(pt.Name, f2.Path().Name)
|
|
||||||
b, err := ioutil.ReadAll(f2)
|
|
||||||
r.NoError(err)
|
r.NoError(err)
|
||||||
r.Equal(body, string(b))
|
r.Equal(body, string(b))
|
||||||
|
|
||||||
r.NoError(f2.Close())
|
b, err = pkgutil.ReadFile(s, tt.in)
|
||||||
|
r.NoError(err)
|
||||||
|
r.Equal(body, string(b))
|
||||||
|
|
||||||
|
r.NoError(f.Close())
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,43 @@
|
||||||
package pkgutil
|
package pkgutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
|
||||||
"github.com/markbates/pkger/pkging"
|
"github.com/markbates/pkger/pkging"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Opener interface {
|
||||||
|
Open(name string) (pkging.File, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Creator interface {
|
||||||
|
Create(name string) (pkging.File, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type OpenFiler interface {
|
||||||
|
OpenFile(name string, flag int, perm os.FileMode) (pkging.File, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReadDir reads the directory named by dirname and returns a list of directory entries sorted by filename.
|
||||||
|
func ReadDir(pkg Opener, dirname string) ([]os.FileInfo, error) {
|
||||||
|
f, err := pkg.Open(dirname)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
list, err := f.Readdir(-1)
|
||||||
|
f.Close()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
sort.Slice(list, func(i, j int) bool { return list[i].Name() < list[j].Name() })
|
||||||
|
return list, nil
|
||||||
|
}
|
||||||
|
|
||||||
// ReadFile reads the file named by filename and returns the contents. A successful call returns err == nil, not err == EOF. Because ReadFile reads the whole file, it does not treat an EOF from Read as an error to be reported.
|
// ReadFile reads the file named by filename and returns the contents. A successful call returns err == nil, not err == EOF. Because ReadFile reads the whole file, it does not treat an EOF from Read as an error to be reported.
|
||||||
func ReadFile(pkg pkging.Pkger, s string) ([]byte, error) {
|
func ReadFile(pkg Opener, s string) ([]byte, error) {
|
||||||
f, err := pkg.Open(s)
|
f, err := pkg.Open(s)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -15,3 +45,32 @@ func ReadFile(pkg pkging.Pkger, s string) ([]byte, error) {
|
||||||
defer f.Close()
|
defer f.Close()
|
||||||
return ioutil.ReadAll(f)
|
return ioutil.ReadAll(f)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteFile writes data to a file named by filename. If the file does not exist, WriteFile creates it with permissions perm; otherwise WriteFile truncates it before writing.
|
||||||
|
func WriteFile(pkg Creator, filename string, data []byte, perm os.FileMode) error {
|
||||||
|
var f pkging.File
|
||||||
|
var err error
|
||||||
|
|
||||||
|
if of, ok := pkg.(OpenFiler); ok {
|
||||||
|
f, err = of.OpenFile(filename, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, perm)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if f == nil {
|
||||||
|
f, err = pkg.Create(filename)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
n, err := f.Write(data)
|
||||||
|
if err == nil && n < len(data) {
|
||||||
|
err = io.ErrShortWrite
|
||||||
|
}
|
||||||
|
if err1 := f.Close(); err == nil {
|
||||||
|
err = err1
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
|
@ -20,6 +20,18 @@ type Pkger struct {
|
||||||
current here.Info
|
current here.Info
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Pkger) OpenFile(name string, flag int, perm os.FileMode) (pkging.File, error) {
|
||||||
|
name, err := p.Abs(name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
f, err := os.OpenFile(name, flag, perm)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return NewFile(p, f)
|
||||||
|
}
|
||||||
|
|
||||||
func (f *Pkger) Abs(p string) (string, error) {
|
func (f *Pkger) Abs(p string) (string, error) {
|
||||||
pt, err := f.Parse(p)
|
pt, err := f.Parse(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in New Issue