使用新的 io.FS 到 fs.WalkDir 并列出跨文件系统类型的文件

使用新的 io.fs 到 fs.walkdir 并列出跨文件系统类型的文件

php小编草莓推荐使用新的io.FS来操作文件系统,特别是在使用fs.WalkDir并列出跨文件系统类型的文件时。这个新的功能能够更加灵活地处理文件操作,让用户能够更方便地获取需要的文件信息。无论是在开发还是维护过程中,这个功能都能够大大提高效率,减少繁琐的操作。如果你想更深入了解如何使用这个功能,不妨继续阅读下去,我们将为你介绍详细的操作步骤和注意事项。

问题内容

我使用新的 io.FS 抽象来遍历文件系统并读取与我们内部文件扩展名匹配的每个文件的前 128 个字节。

这些文件位于本地文件系统和存档文件等(ZIP 和 Tar I thunk)中。

我正在使用 fs.WalkDir,传入 fs.FS (在我的测试中为 os.DIR 和 fstest.MapFS)。行走时,我返回一组“文件”(实际上它们是 *.pzix 和 *.pzi 文件,它们是我们的专有格式)。我找不到使用 FS 接口获取有关我正在处理的文件的一些信息的合适方法。

我想要:

获取文件名获取文件大小获取openfile方法

我发现 Go 中来自 Java/C# 的接口有点令人困惑。我希望对抽象进行操作,但我不知道如何获取文件本身的其他实现(例如,文件接口有 Stat() 和 read)。

我发现的最简单的事情是将路径和文件名存储在数组中,然后当我迭代数组时,确定它是 os.Dir 还是 fstest.MapFS,但这似乎相当违反直觉:

func collectFiles(f fs.FS, root string) []string { var files []string fs.WalkDir(f, ".", func(p string, d fs.DirEntry, err error) error {  if !d.IsDir() { // we also check a few other things in the filename here   f = filepath.Abs(path.Join(root, p))   files = append(files, f)  } } return files}

登录后复制

这给了我:

root = "m://" // mapfsfiles = { "m://id-198271.pzi", "m://id-7125-092581.pzix"}

登录后复制

有没有更聪明的方法让我处理抽象而不做这些事情?因为返回数组后,我必须“打开”文件,读取前 128 个字节(签名)并对文件的其余部分进行哈希处理以确保其“有效”。

编辑:澄清一下, collectFiles 方法正在创建我们的主要文件命中列表,以便在另一种方法中处理。我希望将本地系统文件、zip 文件和 tar 文件传递​​到该方法中,以便它可以迭代存档中的文件并将它们添加到数组中。

希望有一个 File 接口,我可以存储在数组中而不是字符串中,以便后续调用者可以在不知道底层是什么的情况下执行 f.open() 。

解决方法

p 是文件系统中的名称。

通过调用fs.Stat(f, p)获取大小

使用 f.Open(p) 打开文件

示例:

f := os.DirFS("/etc")fs.WalkDir(f, ".", func(p string, d fs.DirEntry, err error) error {    if !d.IsDir() {        st, _ := fs.Stat(f, p)        r, _ := f.Open(p)        defer r.Close()        // Read prefix        var buf [md5.Size]byte        n, _ := io.ReadFull(r, buf[:])        // Hash remainder        h := md5.New()        _, _ = io.Copy(h, r)        s := h.Sum(nil)        fmt.Printf("%s %d %x %x", p, st.Size(), buf[:n], s)    }    return nil})

登录后复制

为了简洁起见,该示例忽略了错误。不要在实际代码中这样做。

https://www.php.cn/link/b599e8250e4481aaa405a715419c8179

以上就是使用新的 io.FS 到 fs.WalkDir 并列出跨文件系统类型的文件的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2356205.html

(0)
上一篇 2025年3月1日 15:41:02
下一篇 2025年3月1日 15:41:30

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 15个Java线程并发面试题和答案

    1. 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行? 这个线程面试题通常在第一轮面试或电话面试时被问到,这道多线程问题为了测试面试者是否熟悉 join 方法的概念。答案也非常…

    2025年5月3日
    000
  • java面试题最容易犯错的8道

    1. static 和 final 的用法 static 的作用从三个方面来谈,分别是静态变量、静态方法、静态类。 静态变量:声明为 static 的静态变量实质上就是全局变量,当声明一个对象时,并不产生static 变量的拷贝,而是该类所…

    2025年5月3日
    000
  • Person p = new Person();在内存中做了哪些事情?

    Person p = new Person();在内存中做了哪些事情? 将Person.class文件加载进内存中。 如果p定义在主方法中,那么,就会在栈空间开辟一个变量空间p。 在堆内存给对象分配空间。 对对象中的成员进行默认初始化。 对…

    2025年5月3日
    000
  • 2020年JAVA最常见面试题汇总(收藏)

    java基础以及多个“比较” 1.collections.sort排序内部原理 在Java 6中Arrays.sort()和Collections.sort()使用的是MergeSort,而在Java 7中,内部实现换成了TimSort,其…

    2025年5月3日
    000
  • 9道常见的java笔试选择题

    1.关于Java编译,下面哪一个正确()(选择一项) A.Java程序经编译后产生machine code B.Java程序经编译后会生产byte code C.Java程序经编译后会产生DLL 立即学习“Java免费学习笔记(深入)”; …

    2025年5月3日
    000
  • java最新基础知识面试题

    java最新基础知识面试题 1、static关键字什么意思?java中是否可以覆盖一个private或者是static的方法? “static”表明一个成员变量或者是成员方法可以在没有所属类的实例变量的情况下访问。 java中static方…

    2025年5月3日
    000
  • java内存溢出面试题

    引起内存溢出的原因有很多种,常见的有以下几种: 内存中加载的数据量过于庞大,如一次从数据库取出过多数据; 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收; 代码中存在死循环或循环产生过多重复的对象实体; 立即学习“Java免费学…

    2025年5月3日
    000
  • Java中高级面试题(附答案)

    1、redis如何跟本地数据同步? 程序实现mysql更新、添加、删除就会同步操作redis 程序查询redis,不存在就查询mysql,自动保存redis 2、redis几种数据结构? set、list、hash、string、zset …

    2025年5月3日
    000
  • java gc 面试题及答案(1~5题)

    1、既然有GC机制,为什么还会有内存泄露的情况? 理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务器端编程的一个重要原因)。然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因…

    2025年5月3日
    000
  • java笔试常见的选择题

    1.已知表达式int m[] = {0,1,2,3,4,5,6}; 下面那个表达式的值与数组的长度相等() A m.length() B. m.length C. m.length()+1 立即学习“Java免费学习笔记(深入)”; D. …

    2025年5月3日
    000

发表回复

登录后才能评论