pathutil
Pathutil is I/O utility primary inspired by David Golden's
Path::Tiny. It is friendlier to use than
path,
filepath and provides many of other
functions which isn't in core libraries (like Copy
for example)
SYNOPSIS
import (
"fmt"
"github.com/JaSei/pathutil-go"
)
// creating pathutil objects
dir, _ := pathutil.New("/tmp")
foo, _ := pathutil.New("foo.txt")
subdir, _ := dir.Child("foo")
bar, _ := subdir.Child("bar.txt")
// stringifies as cleaned up path
file, _ := pathutil.New("./foo.txt")
fmt.Println(file) // "foo.txt"
// reading files
guts, _ := file.Slurp()
lines, _ := file.Lines()
// writing files
bar.Spew(data)
// reading directories
children, _ := dir.Children()
for _, child := range children {
}
SEE ALSO
BREAKING CHANGE 0.3.1 -> 1.0.0
-
NewTempFile
or NewTempDir
don't need TempOpt struct
//0.3.1 default
pathutil.NewTempFile(pathutil.TempOpt{})
//0.3.1 custom
pathutil.NewTempFile(pathutil.TempOpt{Dir: "/test", Prefix: "pre"})
//1.0.0 default
pathutil.NewTempFile()
//1.0.0 custom
pathutil.NewTempFile(Dir("/test"), Prefix("pre"))
-
New
method parameter allowed string
type or type implements
fmt.Stringer
interface
//0.3.1
pathutil.New(otherPath.String(), "test")
//1.0.0
pathutil.New(otherPath, "test")
This shouldn't be breaking change, but if you use in some code variadic
parameter as input of pathutil.New
, then can be problem
//0.3.1
func(p ...string) {
pathutil.New(p...)
}("a", "b")
//1.0.0
func(p ...string) {
n := make([]interface{}, len(p))
for i, v := range p {
n[i] = v
}
pathutil.New(n...)
}("a", "b")
3. There is new (more handfull) crypto API
//0.3.1
import (
"crypto"
"github.com/JaSei/pathutil-go"
)
...
hash, err := path.Crypto(crypto.SHA256)
if err == nil {
fmt.Printf("%s\t%s\n", hash.HexSum(), path.String())
}
//1.0.0
import (
"github.com/JaSei/pathutil-go"
)
...
hash, err := path.CryptoSha256()
if err == nil {
fmt.Printf("%s\t%s\n", hash, path.String())
}
This new crypto API return hashutil struct which
is more handfull for compare, transformation and next hash manipulation.
Usage
type LinesFunc
type LinesFunc func(string)
type Path
type Path interface {
String() string
Canonpath() string
Basename() string
Chdir() (Path, error)
Rename(string) (Path, error)
Stat() (os.FileInfo, error)
IsDir() bool
Exists() bool
IsFile() bool
IsRegularFile() bool
Remove() error
RemoveTree() error
Visit(VisitFunc, VisitOpt)
CopyFile(string) (Path, error)
CopyFrom(io.Reader) (int64, error)
CryptoMd5() (hashutil.Md5, error)
CryptoSha1() (hashutil.Sha1, error)
CryptoSha256() (hashutil.Sha256, error)
CryptoSha384() (hashutil.Sha384, error)
CryptoSha512() (hashutil.Sha512, error)
MakePath() error
MakePathMode(os.FileMode) error
OpenReader() (ReadSeekCloser, error)
OpenWriter() (*os.File, error)
OpenWriterAppend() (*os.File, error)
Slurp() (string, error)
SlurpBytes() ([]byte, error)
Spew(string) error
SpewBytes([]byte) error
Lines() ([]string, error)
LinesWalker(LinesFunc) error
Child(...string) (Path, error)
Children() ([]Path, error)
Parent() Path
Append(string) error
AppendBytes([]byte) error
}
func Cwd
func Cwd(subpath ...string) (Path, error)
Cwd create new Path from current working directory optional is possible to set
subpath
for example
gitConfigPath, err := pathutil.Cwd('.git/config')
func Home
func Home(subpath ...string) (Path, error)
Home create new Path from home directory optional is possible to set subpath
for example
initPath, err := pathutil.Home('.config/nvim/init.vim')
(internally use https://github.com/mitchellh/go-homedir library)
func New
func New(path ...interface{}) (Path, error)
New construct Path
for example
path := New("/home/test", ".vimrc")
input can be string
or type implements fmt.Stringer
interface
func NewTempDir
func NewTempDir(options ...TempOpt) (Path, error)
NewTempDir create temp directory
for cleanup use defer
tempdir, err := pathutil.NewTempDir()
defer tempdir.RemoveTree()
if you need set directory or prefix, then use TempDir
and/or TempPrefix
temp, err := NewTempFile(TempDir("/home/my/test"), TempPrefix("myfile"))
...
func NewTempFile
func NewTempFile(options ...TempOpt) (p Path, err error)
NewTempFile create temp file
for cleanup use defer
temp, err := NewTempFile(TempOpt{})
defer temp.Remove()
if you need only temp file name, you must delete file
temp, err := NewTempFile()
temp.Remove()
if you need set directory or prefix, then use TempDir
and/or TempPrefix
temp, err := NewTempFile(TempDir("/home/my/test"), TempPrefix("myfile"))
...
type PathImpl
type PathImpl struct {
}
type PathImpl implements Path interface
func (PathImpl) Append
func (path PathImpl) Append(data string) error
func (PathImpl) AppendBytes
func (path PathImpl) AppendBytes(data []byte) (err error)
func (PathImpl) Basename
func (path PathImpl) Basename() string
Basename like path/filepath.Base
func (PathImpl) Canonpath
func (path PathImpl) Canonpath() string
Canonpath retrun path with right os separator
func (PathImpl) Chdir
func (path PathImpl) Chdir() (Path, error)
Chdir change current working directory do the path and return old current
working directory
func (PathImpl) Child
func (path PathImpl) Child(childName ...string) (Path, error)
func (PathImpl) Children
func (path PathImpl) Children() ([]Path, error)
func (PathImpl) CopyFile
func (srcPath PathImpl) CopyFile(dst string) (p Path, err error)
func (PathImpl) CopyFrom
func (path PathImpl) CopyFrom(reader io.Reader) (copyied int64, err error)
CopyFrom copy stream from reader to path (file after copy close and sync)
func (PathImpl) CryptoMd5
func (path PathImpl) CryptoMd5() (hashutil.Md5, error)
CryptoMd5 method access hash funcionality like Path::Tiny Digest return
hashutil.Md5 type
for example print of Md5 hexstring
hash, err := path.CryptoMd5()
fmt.Println(hash)
func (PathImpl) CryptoSha1
func (path PathImpl) CryptoSha1() (hashutil.Sha1, error)
CryptoSha1 method access hash funcionality like Path::Tiny Digest return
hashutil.Sha1 type
for example print of Sha1 hexstring
hash, err := path.CryptoSha1()
fmt.Println(hash)
func (PathImpl) CryptoSha256
func (path PathImpl) CryptoSha256() (hashutil.Sha256, error)
CryptoSha256 method access hash funcionality like Path::Tiny Digest return
hashutil.Sha256 type
for example print of Sha256 hexstring
hash, err := path.CryptoSha256()
fmt.Println(hash)
func (PathImpl) CryptoSha384
func (path PathImpl) CryptoSha384() (hashutil.Sha384, error)
CryptoSha384 method access hash funcionality like Path::Tiny Digest return
hashutil.Sha384 type
for example print of Sha284 hexstring
hash, err := path.CryptoSha284()
fmt.Println(hash)
func (PathImpl) CryptoSha512
func (path PathImpl) CryptoSha512() (hashutil.Sha512, error)
CryptoSha512 method access hash funcionality like Path::Tiny Digest return
hashutil.Sha512 type
for example print of Sha512 hexstring
hash, err := path.CryptoSha512()
fmt.Println(hash)
func (PathImpl) Exists
func (path PathImpl) Exists() bool
func (PathImpl) IsDir
func (path PathImpl) IsDir() bool
IsDir return true if path is dir
func (PathImpl) IsFile
func (path PathImpl) IsFile() bool
IsFile return true is path exists and not dir (symlinks, devs, regular files)
func (PathImpl) IsRegularFile
func (path PathImpl) IsRegularFile() bool
IsRegularFile return true if path is regular file (wihtout devs, symlinks, ...)
func (PathImpl) Lines
func (path PathImpl) Lines() ([]string, error)
Read all lines and return as array of lines
func (PathImpl) LinesWalker
func (path PathImpl) LinesWalker(linesFunc LinesFunc) (err error)
LinesWalker read lines in file and call LinesFunc with line parameter
for example:
lines := make([]string, 0)
linesFuncError := path.LinesWalker(func(line string) {
lines = append(lines, line)
})
func (PathImpl) MakePath
func (path PathImpl) MakePath() error
Make path create directory(ies) in path if not exists (like mkdir -p
) with
default 0777 mode if you need set mode, use MakePathMode
func (PathImpl) MakePathMode
func (path PathImpl) MakePathMode(mode os.FileMode) error
Make path create directory(ies) in path if not exists (like mkdir -p
) with
default given mode
func (PathImpl) OpenReader
func (path PathImpl) OpenReader() (ReadSeekCloser, error)
OpenReader retun ReadSeekCloser interface
for example:
path, _ := New("/bla/bla")
r, err := path.OpenReader()
if err != nil {
panic(err)
}
defer r.Close()
func (PathImpl) OpenWriter
func (path PathImpl) OpenWriter() (*os.File, error)
OpenWriter retun *os.File as new file (like >>
)
for example:
path, _ := NewFilePath(FilePathOpt{})
file, err := path.OpenWriter()
if err != nil {
panic(err)
}
defer func(){
file.Close()
file.Sync()
}()
writer.Write(some_bytes)
func (PathImpl) OpenWriterAppend
func (path PathImpl) OpenWriterAppend() (*os.File, error)
OpenWriterAppend create new writer, similar as OpenWriter
but append (like
>
)
func (PathImpl) Parent
func (path PathImpl) Parent() Path
path,_ := New("foo/bar/baz"); parent := path.Parent() // foo/bar
path,_ := New("foo/wible.txt"); parent := path.Parent() // foo
Returns a Path
of corresponding to the parent directory of the original
directory or file
func (PathImpl) Remove
func (path PathImpl) Remove() error
Remove file
err := path.Remove()
like os.Remove
func (PathImpl) RemoveTree
func (path PathImpl) RemoveTree() error
Remove tree of directory(ies) include files
err := path.RemoveTree
like os.RemoveAll
func (PathImpl) Rename
func (old PathImpl) Rename(new string) (Path, error)
Rename path to new path
func (PathImpl) Slurp
func (path PathImpl) Slurp() (string, error)
Slurp read all file like ioutil.ReadFile
func (PathImpl) SlurpBytes
func (path PathImpl) SlurpBytes() ([]byte, error)
func (PathImpl) Spew
func (path PathImpl) Spew(content string) (err error)
Spew write string to file
func (PathImpl) SpewBytes
func (path PathImpl) SpewBytes(bytes []byte) (err error)
SpewBytes write bytes to file
func (PathImpl) Stat
func (path PathImpl) Stat() (os.FileInfo, error)
Stat return os.FileInfo
func (PathImpl) String
func (path PathImpl) String() string
String return stable string representation of path this representation is linux
like (slash as separator) for os specific string use Canonpath method
func (PathImpl) Visit
func (path PathImpl) Visit(visitFunc VisitFunc, visitOpt VisitOpt)
type ReadSeekCloser
type ReadSeekCloser interface {
io.Reader
io.Seeker
io.Closer
}
type TempOpt
type TempOpt func(*tempOpt)
TempOpt is func for configure tempdir or tempfile
func TempDir
func TempDir(dir string) TempOpt
TempDir set directory where is temp file/dir create, empty string ""
(default)
means TEMPDIR (os.TempDir
)
func TempPrefix
func TempPrefix(prefix string) TempOpt
TempPrefix set name beginning with prefix
type VisitFunc
type VisitFunc func(path Path)
type VisitOpt
type VisitOpt struct {
Recurse bool
}
Contributing
Contributions are very much welcome.
Makefile
Makefile provides several handy rules, like README.md generator
, setup
for prepare build/dev environment, test
, cover
, etc...
Try make help
for more information.
Before pull request
please try:
- run tests (
make test
) - run linter (
make lint
) - if your IDE don't automaticaly do
go fmt
, run go fmt
(make fmt
)
README
README.md are generate from template .godocdown.tmpl and code documentation via godocdown.
Never edit README.md direct, because your change will be lost.