mirror of
https://github.com/golang/go.git
synced 2025-05-30 11:51:34 +00:00
os: add DirFS
It will inevitably be important to be able to pass an operating system directory to code written to expect an fs.FS. os.DirFS provides the conversion. For #41190. Change-Id: Id1a8fcbe4c7a30de2c47dea0504e9481a88b1b39 Reviewed-on: https://go-review.googlesource.com/c/go/+/243911 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Rob Pike <r@golang.org>
This commit is contained in:
parent
90c924ff88
commit
b1f76f7a22
@ -45,6 +45,7 @@ import (
|
|||||||
"internal/poll"
|
"internal/poll"
|
||||||
"internal/testlog"
|
"internal/testlog"
|
||||||
"io"
|
"io"
|
||||||
|
"io/fs"
|
||||||
"runtime"
|
"runtime"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
@ -608,3 +609,21 @@ func isWindowsNulName(name string) bool {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DirFS returns a file system (an fs.FS) for the tree of files rooted at the directory dir.
|
||||||
|
func DirFS(dir string) fs.FS {
|
||||||
|
return dirFS(dir)
|
||||||
|
}
|
||||||
|
|
||||||
|
type dirFS string
|
||||||
|
|
||||||
|
func (dir dirFS) Open(name string) (fs.File, error) {
|
||||||
|
if !fs.ValidPath(name) {
|
||||||
|
return nil, &PathError{Op: "open", Path: name, Err: ErrInvalid}
|
||||||
|
}
|
||||||
|
f, err := Open(string(dir) + "/" + name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err // nil fs.File
|
||||||
|
}
|
||||||
|
return f, nil
|
||||||
|
}
|
||||||
|
@ -23,6 +23,7 @@ import (
|
|||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"testing"
|
"testing"
|
||||||
|
"testing/fstest"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -2671,3 +2672,9 @@ func TestOpenFileKeepsPermissions(t *testing.T) {
|
|||||||
t.Errorf("Stat after OpenFile is %v, should be writable", fi.Mode())
|
t.Errorf("Stat after OpenFile is %v, should be writable", fi.Mode())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestDirFS(t *testing.T) {
|
||||||
|
if err := fstest.TestFS(DirFS("./signal"), "signal.go", "internal/pty/pty.go"); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user