forked from toolshed/abra
		
	
		
			
				
	
	
		
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# go-billy [](https://pkg.go.dev/github.com/go-git/go-billy/v5) [](https://github.com/go-git/go-billy/actions?query=workflow%3ATest)
 | 
						|
 | 
						|
The missing interface filesystem abstraction for Go.
 | 
						|
Billy implements an interface based on the `os` standard library, allowing to develop applications without dependency on the underlying storage. Makes it virtually free to implement mocks and testing over filesystem operations.
 | 
						|
 | 
						|
Billy was born as part of [go-git/go-git](https://github.com/go-git/go-git) project.
 | 
						|
 | 
						|
## Installation
 | 
						|
 | 
						|
```go
 | 
						|
import "github.com/go-git/go-billy/v5" // with go modules enabled (GO111MODULE=on or outside GOPATH)
 | 
						|
import "github.com/go-git/go-billy" // with go modules disabled
 | 
						|
```
 | 
						|
 | 
						|
## Usage
 | 
						|
 | 
						|
Billy exposes filesystems using the
 | 
						|
[`Filesystem` interface](https://pkg.go.dev/github.com/go-git/go-billy/v5?tab=doc#Filesystem).
 | 
						|
Each filesystem implementation gives you a `New` method, whose arguments depend on
 | 
						|
the implementation itself, that returns a new `Filesystem`.
 | 
						|
 | 
						|
The following example caches in memory all readable files in a directory from any
 | 
						|
billy's filesystem implementation.
 | 
						|
 | 
						|
```go
 | 
						|
func LoadToMemory(origin billy.Filesystem, path string) (*memory.Memory, error) {
 | 
						|
	memory := memory.New()
 | 
						|
 | 
						|
	files, err := origin.ReadDir("/")
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	for _, file := range files {
 | 
						|
		if file.IsDir() {
 | 
						|
			continue
 | 
						|
		}
 | 
						|
 | 
						|
		src, err := origin.Open(file.Name())
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
 | 
						|
		dst, err := memory.Create(file.Name())
 | 
						|
		if err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
 | 
						|
		if _, err = io.Copy(dst, src); err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
 | 
						|
		if err := dst.Close(); err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
 | 
						|
		if err := src.Close(); err != nil {
 | 
						|
			return nil, err
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return memory, nil
 | 
						|
}
 | 
						|
```
 | 
						|
 | 
						|
## Why billy?
 | 
						|
 | 
						|
The library billy deals with storage systems and Billy is the name of a well-known, IKEA
 | 
						|
bookcase. That's it.
 | 
						|
 | 
						|
## License
 | 
						|
 | 
						|
Apache License Version 2.0, see [LICENSE](LICENSE)
 |