Showing posts with label FS. Show all posts
Showing posts with label FS. Show all posts

Wednesday, February 16, 2022

Traverse into zip files when walking the file system

func WalkDirZip(fsys fs.FS, root string, fn WalkDirFunc) error {
    return fs.WalkDir(fsys, root, func(path string, d fs.DirEntry, err error) error {
        if d.IsDir() || !strings.EqualFold(filepath.Ext(path), ".zip") {
            return fn(fsys, path, d, err)
        } else if f, err := fsys.Open(path); err != nil {
            return err
        } else if s, err := f.Stat(); err != nil {
            return err
        } else if zfs, err := zip.NewReader(f.(io.ReaderAt), s.Size()); err != nil {
            return err
        } else {
            return fs.WalkDir(zfs, ".", func(path string, d fs.DirEntry, err error) error {
                return fn(zfs, path, d, err)
            })
        }
    })
}

type WalkDirFunc func(fsys fs.FS, path string, d fs.DirEntry, err error) error