golang获取当前目录下的所有文件名判断新传入的文件名是否会重名如果重名则将文件名进行修改为唯一名称
您可以使用ioutil.ReadDir函数来获取当前目录下的所有文件名,然后使用os.Stat函数来判断新传入的文件名是否重名,如果重名则可以通过在文件名后面添加数字或者随机字符串来生成唯一名称。
下面是一个示例代码:
package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
"strings"
)
func main() {
// 获取当前目录
dir, err := os.Getwd()
if err != nil {
fmt.Println("获取当前目录失败:", err)
return
}
// 获取当前目录下的所有文件名
files, err := ioutil.ReadDir(dir)
if err != nil {
fmt.Println("读取目录失败:", err)
return
}
// 新传入的文件名
newFileName := "example.txt"
// 判断是否重名
for _, file := range files {
if strings.EqualFold(file.Name(), newFileName) {
// 生成唯一名称
newFileName = generateUniqueName(newFileName, files)
break
}
}
fmt.Println("新的文件名:", newFileName)
}
// 生成唯一名称
func generateUniqueName(fileName string, files []os.FileInfo) string {
ext := filepath.Ext(fileName) // 文件扩展名
base := strings.TrimSuffix(fileName, ext) // 文件名(不包含扩展名)
// 判断是否已经有数字后缀
hasNumberSuffix := false
for _, file := range files {
if strings.HasPrefix(file.Name(), base) {
if _, err := fmt.Sscanf(file.Name(), "%s%d%s", base, new(int), ext); err == nil {
hasNumberSuffix = true
break
}
}
}
// 生成唯一名称
for i := 1; ; i++ {
if hasNumberSuffix {
fileName = fmt.Sprintf("%s%d%s", base, i, ext)
} else {
fileName = fmt.Sprintf("%s_%d%s", base, i, ext)
}
// 判断是否重名
isUnique := true
for _, file := range files {
if strings.EqualFold(file.Name(), fileName) {
isUnique = false
break
}
}
if isUnique {
break
}
}
return fileName
}
在上面的示例代码中,首先使用os.Getwd函数获取当前目录,然后使用ioutil.ReadDir函数读取当前目录下的所有文件名。接下来,我们传入一个新的文件名example.txt,通过遍历当前目录下的文件名,判断是否重名。如果重名,则调用generateUniqueName函数生成一个唯一名称。generateUniqueName函数首先获取文件的扩展名和不包含扩展名的文件名,然后判断是否已经有数字后缀。如果有数字后缀,则在数字后面继续递增数字;如果没有数字后缀,则在文件名后面添加下划线和数字。最后,判断生成的唯一名称是否重名,如果重名则继续生成唯一名称,直到找到一个唯一的名称为止。
请注意,这只是一个简单的示例代码,可能还需要根据实际需求进行相应的修改。
原文地址: http://www.cveoy.top/t/topic/hOk9 著作权归作者所有。请勿转载和采集!