首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我自己的`fs.FS`实现中包装一个`fs.FS`使`fs.Glob()‘不返回任何匹配

在我自己的`fs.FS`实现中包装一个`fs.FS`使`fs.Glob()‘不返回任何匹配
EN

Stack Overflow用户
提问于 2022-07-20 13:50:54
回答 1查看 42关注 0票数 1

我将一些文件嵌入到我的应用程序中,并使用embed.FS访问它们。在某种程度上,我在代码中使用fs.Glob(embedFS, ...)。一切都如期而至。现在,在继续处理文件内容之前,我需要用空格替换换行符。我可以读取整个文件并执行类似于bytes.ReplaceAll(...)的操作,但我希望这样做更好,而不是要求在使用包时进行替换(尽管我可以对用户隐藏这一点)。我决定在fs.FS (和fs.File)周围实现一个包装器,在读取文件时处理替换问题。但是我的实现破坏了fs.Glob(),因为它不返回任何匹配:

代码语言:javascript
复制
type noLineBreakFile struct {
    file fs.File
}

func (f *noLineBreakFile) Stat() (fs.FileInfo, error) {
    return f.file.Stat()
}

func (f *noLineBreakFile) Read(p []byte) (n int, err error) {
    n, err = f.file.Read(p)
    pp := bytes.ReplaceAll(p, []byte{'\n'}, []byte{' '})
    copy(p, pp)
    return
}

func (f *noLineBreakFile) Close() error {
    return f.file.Close()
}

type noLineBreakFS struct {
    fs fs.FS
}

func (fs *noLineBreakFS) Open(name string) (fs.File, error) {
    f, err := fs.fs.Open(name)
    if err != nil {
        return nil, err
    }
    return &noLineBreakFile{f}, nil // <- returning f without the wrapper works fine
}

//go:embed *.tmpl
var embedFS embed.FS

func main() {
    matches, err := fs.Glob(embedFS) // Works fine ...
    fmt.Println(matches, err)

    matches, err = fs.Glob(&noLineBreakFS{embedFS}) // No matches!
    fmt.Println(matches, err)
}

我的fs.File (noLineBreakFile)的实现有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-20 23:17:48

实现ReadDirFile,以便Glob能够读取目录条目。

代码语言:javascript
复制
func (nfs *noLineBreakFS) ReadDir(name string) ([]fs.DirEntry, error) {
    return fs.ReadDir(nfs.fs, name)
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73052897

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档