Closed
Description
After discussion on #45757 (comment) and #61386, it would help many different use cases to add os.CopyFS that copies an fsys.FS into the local file system, safely. I propose to add that function.
The signature and implementation are roughly:
func CopyFS(dir string, fsys fs.FS) error {
return fs.WalkDir(fsys, ".", func(path string, d fs.DirEntry, err error) error {
targ := filepath.Join(dir, filepath.FromSlash(path))
if d.IsDir() {
if err := os.MkdirAll(targ, 0777); err != nil {
return err
}
return nil
}
r, err := fsys.Open(path)
if err != nil {
return err
}
defer r.Close()
info, err := r.Stat()
if err != nil {
return err
}
w, err := os.OpenFile(targ, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666|info.Mode()&0777)
if err != nil {
return err
}
if _, err := io.Copy(w, r); err != nil {
w.Close()
return fmt.Errorf("copying %s: %v", path, err)
}
if err := w.Close(); err != nil {
return err
}
return nil
})
}
with perhaps some extra checks using filepath.IsLocal to guard against bad file names.
Metadata
Metadata
Assignees
Type
Projects
Status
Done
Status
Accepted