索引文件夹目录结构工具

Hexa 教程 发布于 3 天前 4 次阅读


使用 Go语言 遍历文件夹并生成 CSV 报告

在日常开发工作中,尤其是文件管理和数据分析时,需要索引查询文件位置,想要单独保存一份或者导入结构进数据库就需要遍历文件夹并导出文件夹结构或元数据(如文件名、修改时间等)。所以干脆使用 Go 语言编写一个程序,遍历指定文件夹,并将文件夹结构保存到一个 CSV 文件中。这样,我们可以方便地查看文件夹的内容,并进行进一步的处理。

思路

程序要求用户输入一个文件夹路径,然后递归遍历该文件夹的所有文件和子文件夹,并将每个文件的路径、文件名、是否为文件夹、以及最后修改时间导出到一个 CSV 文件中。后续可以进行数据分析或操作。

代码

package main

import (
	"encoding/csv"
	"fmt"
	"os"
	"path/filepath"
	"time"
)

func main() {
	var root string
	fmt.Print("请输入文件夹路径: ")
	fmt.Scanln(&root)

	outputFile, err := os.Create("directory_structure.csv")
	if err != nil {
		fmt.Println("无法创建文件:", err)
		return
	}
	defer outputFile.Close()

	writer := csv.NewWriter(outputFile)
	defer writer.Flush()

	writer.Write([]string{"路径", "文件名", "是否文件夹", "修改时间"})

	err = filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			fmt.Println("读取文件信息错误:", err)
			return nil
		}
		writer.Write([]string{
			filepath.Dir(path),
			info.Name(),
			fmt.Sprintf("%v", info.IsDir()),
			info.ModTime().Format(time.RFC3339),
		})
		time.Sleep(250 * time.Millisecond) // 每秒 2 次限制
		return nil
	})

	if err != nil {
		fmt.Println("遍历文件夹时出错:", err)
	} else {
		fmt.Println("目录结构已保存到 directory_structure.csv")
	}
}

功能分析

  1. 用户输入文件夹路径
    程序首先要求用户输入文件夹的路径,这个路径将作为根目录,程序将从此目录开始递归遍历所有文件和文件夹。
  2. 创建 CSV 文件
    程序使用 os.Create 函数创建一个名为 directory_structure.csv 的 CSV 文件。如果文件创建失败,将输出错误信息并退出。
  3. CSV 写入器设置
    使用 csv.NewWriter 创建一个 CSV 写入器,并调用 defer writer.Flush() 确保在程序结束时将缓冲区中的内容写入文件。
  4. 表头写入
    写入 CSV 文件的第一行作为表头,包含列名:路径、文件名、是否文件夹、修改时间。
  5. 递归遍历文件夹
    filepath.Walk 是 Go 语言提供的一个用于递归遍历文件夹的函数。它会遍历指定目录及其子目录中的所有文件和文件夹。在回调函数中,程序获取每个文件的路径、文件信息(包括是否是文件夹)以及修改时间,并将这些信息写入 CSV 文件。
  6. 处理错误
    在遍历过程中,如果遇到错误(例如权限不足或文件丢失),程序会打印错误信息并继续执行。
  7. 限制写入频率
    time.Sleep(250 * time.Millisecond) 用于限制每次文件信息写入的频率,避免过于频繁的操作,这样可以减轻系统负担并避免 API 调用过快。
  8. 打印日志
    如果没有发生错误,程序将提示“目录结构已保存到 directory_structure.csv”。

函数解析

  • filepath.Walk
    这个函数接受一个目录路径和一个回调函数,回调函数会被调用每次遍历到一个文件或文件夹。回调函数接收三个参数:
    • path:当前文件或文件夹的完整路径。
    • info:一个 os.FileInfo 对象,包含该文件或文件夹的详细信息,如是否为目录、文件大小、修改时间等。
    • err:读取文件信息时可能遇到的错误。
  • info.IsDir()
    通过 info.IsDir() 判断当前路径是否为文件夹。如果是文件夹,返回 true,否则返回 false
  • info.ModTime().Format(time.RFC3339)
    通过 info.ModTime() 获取文件的最后修改时间,使用 RFC3339 格式化为字符串。这样可以方便地展示时间,并且保证格式的一致性。

示例运行

假设我们有以下目录结构:

/home/user/docs/
├── file1.txt
├── file2.txt
└── folder1
    ├── file3.txt
    └── file4.txt

运行程序时,输入文件夹路径为 /home/user/docs/,生成的 directory_structure.csv 文件内容可能如下所示:

路径,文件名,是否文件夹,修改时间
/home/user/docs,folder1,true,2024-12-21T10:00:00Z
/home/user/docs/folder1,file3.txt,false,2024-12-21T10:05:00Z
/home/user/docs/folder1,file4.txt,false,2024-12-21T10:06:00Z
/home/user/docs,file1.txt,false,2024-12-21T10:00:00Z
/home/user/docs,file2.txt,false,2024-12-21T10:02:00Z

总结

其实就是利用 filepath.Walk 函数遍历文件夹并将目录结构保存到 CSV 文件中,非常适用于需要记录和分析文件夹结构,获取索引文件的场景。通过简单的用户输入和 CSV 输出,用户可以快速生成目录结构报告,并进行进一步的数据处理或分析。

  • 适用场景:文件管理、文件夹结构分析、备份工具、数据导出。
  • 扩展功能:可以增加文件大小、权限、文件类型等信息,或增加日志记录功能。