Golang实现遍历所有磁盘文件的方法

Golang实现遍历所有磁盘文件的方法 大家好… 我想在任何系统驱动器上查找文件… 我的代码有什么问题? 错误:无法在 filepath.Walk 的参数中使用 root(类型为 []string)作为字符串类型

代码行:err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {

var files []string
  SystemDirvesList := []string{}
  for _, drives := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ" {
    _, err := os.Open(string(drives) + ":\\")
    if err == nil {
      SystemDirvesList = append(SystemDirvesList, string(drives))
    }

  }

  root := SystemDirvesList
  err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
    files = append(files, path)
    return nil
  })
  if err != nil {
    panic(err)
  }
  for _, file := range files {
    fmt.Println(file)
  }

更多关于Golang实现遍历所有磁盘文件的方法的实战教程也可以访问 https://www.itying.com/category-94-b0.html

21 回复

谢谢兄弟…

更多关于Golang实现遍历所有磁盘文件的方法的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


我该如何解决这个问题?

不行,我的脚本有问题。

你试过我之前建议的循环方法吗?

func main() {
    fmt.Println("hello world")
}

我已经告诉过你如何修复这个问题,使用那个该死的循环然后逐个解决出现的错误。

什么样的问题?请尽可能准确地描述你的问题,并提供他人帮助你所需的足够背景信息。

那么现在它对你起作用了吗?

我无法在这里测试我的理论,因为我使用的操作系统没有驱动器盘符。

错误信息已经说明了。root 需要是单个字符串,而不是其切片。

遍历 root 中的元素可能会有帮助?

func main() {
    fmt.Println("hello world")
}

嘿,我已经尝试了各种方法但还是无法解决这个问题… 如果你有办法的话请帮帮我

我已经尽力了。那么在你修复了想要传递给 filepath.Walkfunc 字面量中的两个错误之后,接下来发生了什么?

兄弟,这是我的错误:

Error : cannot use root (type []string) as type string in argument to filepath.Walk

我不知道该怎么解决这个问题。

我过去一直用Python编写程序。我测试过这个循环,但它不能正常工作(像Python那样)… 可能这段代码需要类型转换。

for _,TestVariable := range DriversList{
bla bla bla
}

我按照这种方式测试了机器人,但没有正常工作。请查看这个屏幕截图:

Sketch

由于您最初展示的代码中没有 DriversList,我无法判断您做了什么。

我也不知道循环体应该是什么,因为原始代码中没有 bla bla bla

请展示无法正常工作的代码,并显示它产生的错误。

同时请使用 Markdown 来标记您的代码块,如下所示:

// 你的代码在这里

抱歉,但我无法从截图中复制粘贴内容。

不过大致如下:

for _, r := range root {
  err := filepath.Walk(r, …)
  // 错误处理和其他代码
}

使用循环是从 []T 中获取 T 的最简单方法。


附注:所有截图都没有显示你在在所有驱动器中查找文件帖子中想要表达的内容

下一张截图将被视为不存在。大多数时候我都是通过手机浏览论坛,截图在这里很难看清。正确标记的代码块效果更好,而且不会占用我的带宽配额。

从我能读懂的 filepath.Walk 文档来看,info 参数的类型需要是 os.FileInfo,可能你忘记进行类型限定。

无论如何,你试图传递给 filepath.Walk 的函数似乎完全不对…参数列表中的 root 似乎放错了位置。

问题在于filepath.Walk函数需要单个字符串路径作为第一个参数,但你传递了一个字符串切片SystemDirvesList。你需要分别遍历每个驱动器并调用filepath.Walk

以下是修正后的代码:

package main

import (
    "fmt"
    "os"
    "path/filepath"
)

func main() {
    var files []string
    SystemDirvesList := []string{}
    
    // 检测可用驱动器
    for _, drive := range "ABCDEFGHIJKLMNOPQRSTUVWXYZ" {
        drivePath := string(drive) + ":\\"
        _, err := os.Open(drivePath)
        if err == nil {
            SystemDirvesList = append(SystemDirvesList, drivePath)
        }
    }

    // 遍历每个驱动器
    for _, root := range SystemDirvesList {
        err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
            if err != nil {
                return err
            }
            files = append(files, path)
            return nil
        })
        if err != nil {
            fmt.Printf("遍历驱动器 %s 时出错: %v\n", root, err)
        }
    }

    // 输出所有文件路径
    for _, file := range files {
        fmt.Println(file)
    }
}

主要修改:

  1. filepath.Walk调用放在循环中,分别处理每个驱动器路径
  2. 在遍历函数中添加了错误处理
  3. 使用drivePath变量使代码更清晰
  4. 添加了遍历时的错误日志输出

这个修正版本会分别遍历每个可用的驱动器,并将所有找到的文件路径收集到files切片中。

回到顶部