Go判断文件夹是否存在并创建

本文提供了一段简洁的Go语言代码,用于检查指定目录是否存在,若不存在则自动创建。通过os包的功能,实现了目录的统计与创建操作,并对错误进行了妥善处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码,简洁易懂:

package main

import (
	"fmt"
	"os"
)

func main() {
	temp_dir := "./temp"
	_, err := os.Stat(temp_dir)
	if err != nil {
		fmt.Println("stat temp dir error,maybe is not exist, maybe not")
		if os.IsNotExist(err) {
			fmt.Println("temp dir is not exist")
			err := os.Mkdir(temp_dir, os.ModePerm)
			if err != nil {
				fmt.Printf("mkdir failed![%v]\n", err)
			}
			return
		}

		fmt.Println("stat file error")
		return
	}

	fmt.Println("temp_dir is exist")
}

 

 

<think>嗯,用户想用Go语言写一个统计文件夹下txt文件数量的程序。首先我得回忆一下Go的文件操作相关包,应该是用os或者path/filepath这些标准库。用户可能对Go不太熟悉,所以需要步骤详细一些。 首先,确定目标:遍历指定文件夹,统计其中所有后缀为.txt的文件。可能需要处理子目录,用户没说是否包含子目录,但通常这类统计是包括子文件夹的,所以应该考虑递归或者使用filepath.Walk。 然后,考虑如何判断文件是否是txt。可以用strings.HasSuffix来判断文件名是否以.txt结尾。不过要注意大小写的问题,比如.TXT或者.Txt,但通常应该区分大小写,除非用户特别说明。这里可能默认区分,或者转换成小写再比较。 接下来,处理文件路径。使用filepath.Walk函数比较方便,它可以递归遍历所有子目录。需要定义一个处理函数,对每个文件进行检查,如果是txt就计数。 然后,处理可能的错误,比如文件夹存在,或者权限问题。在WalkFunc中需要处理错误,返回nil继续执行还是终止。 然后,代码结构大概分为:获取输入路径,初始化计数器,调用Walk函数,处理每个文件,最后输出结果。 测试一下,比如创建一个测试文件夹,里面有几个txt和其他文件,看看程序是否能正确统计。 可能遇到的问题:路径中的斜杠方向,比如Windows用反斜杠,但Go的filepath会处理。另外,符号链接是否需要处理?默认情况下可能不统计,但用户没说,可以忽略。 另外,是否需要处理隐藏文件?比如以点开头的txt文件,应该包括在内,因为用户没有特别说明排除。 最后,给出代码示例,解释关键部分,比如Walk函数的使用,计数器的原子操作是否需要,但因为是单线程遍历,直接用普通变量加锁可能不需要,不过Walk是发安全的吗?查文档,filepath.Walk是按顺序处理的,所以直接累加计数器是安全的。 然后,代码的大致步骤: 1. 导入必要的包:fmt、path/filepath、strings。 2. 定义计数器变量。 3. 使用filepath.Walk遍历指定路径。 4. 在WalkFunc中,针对每个文件,判断是否是普通文件(排除目录),然后检查扩展名。 5. 统计数量,最后打印结果。 可能的错误处理:检查Walk的返回值,比如路径是否存在,处理错误情况。 最后,测试代码是否正确,比如在main函数中调用,处理命令行参数,或者直接写死路径测试。用户可能需要从命令行参数获取路径,所以代码示例中应该演示如何读取参数,比如os.Args[1]。</think>以下是用Go语言统计指定文件夹下(包括子目录).txt文件数量的示例代码及分步说明: ```go package main import ( "fmt" "os" "path/filepath" "strings" ) func main() { // 初始化计数器 count := 0 // 获取要统计的目录路径(通过命令行参数传入) if len(os.Args) < 2 { fmt.Println("请指定要统计的目录路径") return } root := os.Args[1] // 使用filepath.Walk遍历目录 err := filepath.Walk(root, func(path string, info os.FileInfo, err error) error { if err != nil { return err // 处理遍历过程中可能出现的错误 } // 跳过目录,只统计文件 if !info.Mode().IsRegular() { return nil } // 检查文件扩展名是否为.txt(不区分大小写) if strings.EqualFold(filepath.Ext(path), ".txt") { count++ } return nil }) // 处理遍历错误 if err != nil { fmt.Printf("遍历目录时出错: %v\n", err) return } // 输出统计结果 fmt.Printf("目录 %s 及其子目录中共找到 %d 个txt文件\n", root, count) } ``` 代码说明: 1. 通过`os.Args`获取命令行参数,第一个参数为要统计的目录路径 2. 使用`filepath.Walk`递归遍历目录及其子目录: - 自动处理不同操作系统的路径分隔符 - 对每个文件/目录执行回调函数 3. 回调函数中: - 跳过目录和非普通文件 - 使用`filepath.Ext`获取文件扩展名 - 用`strings.EqualFold`进行不区分大小写的扩展名匹配 4. 统计符合条件的文件数量 5. 处理可能出现的遍历错误 6. 最后输出统计结果 使用方法: 1. 编译程序:`go build count_txt.go` 2. 运行程序:`./count_txt /path/to/directory` 特性说明: - 支持子目录递归查找 - 不区分大小写(.TXT/.Txt等格式都会统计) - 自动跳过符号链接等特殊文件 - 显示友好的错误提示 注意事项: 1. 需要文件读取权限 2. 超大目录遍历可能需要较长时间 3. 统计结果包含所有层级的子目录 4. 精确匹配扩展名(即只统计*.txt文件)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值