Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法使用go中的filepath.Walk()重命名给定路径中的所有目录_Go - Fatal编程技术网

无法使用go中的filepath.Walk()重命名给定路径中的所有目录

无法使用go中的filepath.Walk()重命名给定路径中的所有目录,go,Go,这是我的访问功能 func visit(path string, f os.FileInfo, err error) error { if !f.IsDir() { return nil } str := path if str == config.Path { return nil } if str == config.LatestPath { return nil } dir :=

这是我的访问功能

func visit(path string, f os.FileInfo, err error) error {
    if !f.IsDir() {
        return nil
    }
    str := path
    if str == config.Path {
        return nil
    }
    if str == config.LatestPath {
        return nil
    }
    dir := str
    dir = strings.TrimPrefix(str, filepath.Dir("C:\\Users\\Mark\\Desktop\\testfolder\\"))
    slashes := strings.Count(dir, "\\")
    if slashes < config.PrevSlashes {
        x := len(config.Slashes) - 1
        for x > slashes {
            config.Slashes[x] = 0
            x--
        }
    }
    config.Slashes[slashes]++
    config.PrevSlashes = slashes
    prename := ""
    for k, v := range config.Slashes {
        if k != 0 {
            if k <= slashes {
                prename += strconv.Itoa(v) + "."
            }
        }
    }
    fmt.Println(config.Slashes)
    myRegex := `(\\(?P<number>[\d\.]*))  \w`
    for i := 0; i < slashes-1; i++ {
        myRegex += `(\\(?P<number` + strconv.Itoa(i) + `>[\d\.]*))  \w*`
    }
    re := regexp.MustCompile(myRegex)
    for i, match := range re.FindAllString(dir, -1) {
        return nil
        fmt.Println(i, match)
    }
    Cdir := filepath.Dir(path)
    newpath := fmt.Sprintf("%s\\%s  %s", Cdir, prename, f.Name())
    config.LatestPath = path
    os.Rename(path, newpath)
    return nil
}
我遇到的问题是filepath,Walk()看不到更改的目录名

它首先将testfolder\a\aa\aaa重命名为testfolder\1。a\aa\aaa,然后尝试将testfolder\a\aa\aaa重命名为testfolder\a\1。aa\aaa但我希望它重命名testfolder\1。a\aa\aaa到testfolder\1。a\1.1。aa\aaa

最终结果应该是

\testfolder\1. a\1.1. aa\1.1.1. aaa
\testfolder\1. a\1.1. aa\1.1.2. aab
\testfolder\1. a\1.1. aa\1.1.3. aac
\testfolder\1. a\1.2. ab\1.2.1. aaa
\testfolder\1. a\1.2. ab\1.2.2. aab
\testfolder\2. b\2.1. aa\2.1.1. aaa
\testfolder\2. b\2.1. aa\2.2.2. aab
简单地说,我想将一个目录命名为“x.name”,其中的文件夹命名为“x.x.name”,其中x是一个数字

编辑1:我通过计算路径名并将其放入数组中,然后在filepath.Walk()函数完成后重命名目录,解决了这个问题

func visit(path string, f os.FileInfo, err error) (error) {
if err != nil {
    log.Fatal(err)
}
if !f.IsDir() {
    return nil
}
str := path
if str == config.Path {
    return nil
}
dir := str
dir = strings.TrimPrefix(str, filepath.Dir("C:\\Users\\Mark\\Desktop\\testfolder\\"))
slashes := strings.Count(dir, "\\")
if slashes < config.PrevSlashes {
    x := len(config.Slashes) - 1
    for x > slashes {
        config.Slashes[x] = 0
        x--
    }
}
config.Slashes[slashes]++
config.PrevSlashes = slashes
prename := ""
for k, v := range config.Slashes {
    if k != 0 {
        if k <= slashes {
            prename += strconv.Itoa(v) + "."
        }
    }
}
myRegex := `(\\(?P<number>[\d\.]*))  \w`
for i := 0; i < slashes-1; i++ {
    myRegex += `(\\(?P<number` + strconv.Itoa(i) + `>[\d\.]*))  \w*`
}
re := regexp.MustCompile(myRegex)
for i, match := range re.FindAllString(dir, -1) {
    config.Dirpaths[slashes] = fmt.Sprintf("%s", f.Name())
    return nil
    fmt.Println(i, match)
}
config.Dirpaths[slashes] = fmt.Sprintf("%s  %s", prename, f.Name())
prenameOld := ""
for k, v := range config.Dirpaths {
    if k != 0 {
        if v != "" {
            if k == slashes {
                break
            }
            prenameOld += v + "\\"
        }
    }
}
oldname := strings.TrimRight(config.Path+prenameOld+f.Name(), "\\")
newName := strings.TrimRight(config.Path+prenameOld+config.Dirpaths[slashes], "\\")
if len(config.OldNames) != config.MaxDir {
    config.OldNames = append(config.OldNames, oldname)
    config.NewNames = append(config.NewNames, newName)
}
return nil
}
func访问(路径字符串,f os.FileInfo,err error)(错误){
如果错误!=零{
log.Fatal(错误)
}
如果!f.IsDir(){
归零
}
str:=路径
如果str==config.Path{
归零
}
dir:=str
dir=strings.TrimPrefix(str,filepath.dir(“C:\\Users\\Mark\\Desktop\\testfolder\\”)
斜杠:=strings.Count(dir,“\\”)
如果斜杠斜杠{
配置斜杠[x]=0
x--
}
}
配置斜杠[斜杠]++
config.PrevSlashes=斜线
prename:=“”
对于k,v:=范围配置斜杠{
如果k!=0{
如果k查看for
文件路径.Walk,您将看到它执行以下操作:

  • 对当前目录的名称进行排序
  • 对于每个名称:
    • 调用回调函数
    • 呼叫
      walk(姓名)
对于给定的目录,
testfolder
中的第一个调用将用于
testfolder/a
,因为
testfolder/1
还不存在

无论您做什么,
Walk
都不会重新读取
testfolder/
,因此它永远不会看到新的
1.a
子目录

Walk
过程中重命名dir/文件是获得错误行为的一种好方法。 相反,我建议您自己列出目录中的文件,并执行自己的递归

大致如下:

  • 选择下一个
    dir
    进行处理(默认情况下,
    testfolder
  • 使用读取
    dir
    的当前子目录/文件
  • 对于每个条目:
    • 根据需要重命名
    • 将新名称添加到要处理的目录列表中
这使用迭代。或者,您可以在新名称上递归(这是
filepath.Walk
失败的地方,因为它不知道新名称)。

如果查看for
filepath.Walk
,您将看到它执行以下操作:

  • 对当前目录的名称进行排序
  • 对于每个名称:
    • 调用回调函数
    • 呼叫
      walk(姓名)
对于给定的目录,
testfolder
中的第一个调用将用于
testfolder/a
,因为
testfolder/1
还不存在

无论您做什么,
Walk
都不会重新读取
testfolder/
,因此它永远不会看到新的
1.a
子目录

Walk
过程中重命名dir/文件是获得错误行为的一种好方法。 相反,我建议您自己列出目录中的文件,并执行自己的递归

大致如下:

  • 选择下一个
    dir
    进行处理(默认情况下,
    testfolder
  • 使用读取
    dir
    的当前子目录/文件
  • 对于每个条目:
    • 根据需要重命名
    • 将新名称添加到要处理的目录列表中

这使用迭代。或者,您可以在新名称上递归(这里是
filepath.Walk
失败的地方,因为它不知道新名称).

请澄清您希望重命名的内容,这一点现在还不清楚。请澄清您希望重命名的内容,这一点现在还不清楚。是否有解决方法或其他功能可用于实现我想要的结果?我已更新了答案,建议使用File.ReadDirNames和process directory最好先“潜入”(递归调用subdirs上的函数)然后重新命名。这样,代码将首先重命名叶目录,无需重新加载。这绝对是一种选择。此时,我们在深度和广度之间进行选择。不确定是否有明确的赢家。无论哪种方式,
filepath.Walk
都不是特别合适。是否有变通方法或其他功能可用于实现我更新了我的答案,建议使用File.ReadDirNames并逐个目录处理目录。最好先“深入”(递归调用subdirs上的函数)然后重命名。这样,代码将首先重命名叶目录,无需重新加载。这绝对是一种选择。此时,我们正在深度和广度之间进行选择。不确定是否有明确的赢家。无论哪种方式,
filepath.Walk
都不是特别合适。
func visit(path string, f os.FileInfo, err error) (error) {
if err != nil {
    log.Fatal(err)
}
if !f.IsDir() {
    return nil
}
str := path
if str == config.Path {
    return nil
}
dir := str
dir = strings.TrimPrefix(str, filepath.Dir("C:\\Users\\Mark\\Desktop\\testfolder\\"))
slashes := strings.Count(dir, "\\")
if slashes < config.PrevSlashes {
    x := len(config.Slashes) - 1
    for x > slashes {
        config.Slashes[x] = 0
        x--
    }
}
config.Slashes[slashes]++
config.PrevSlashes = slashes
prename := ""
for k, v := range config.Slashes {
    if k != 0 {
        if k <= slashes {
            prename += strconv.Itoa(v) + "."
        }
    }
}
myRegex := `(\\(?P<number>[\d\.]*))  \w`
for i := 0; i < slashes-1; i++ {
    myRegex += `(\\(?P<number` + strconv.Itoa(i) + `>[\d\.]*))  \w*`
}
re := regexp.MustCompile(myRegex)
for i, match := range re.FindAllString(dir, -1) {
    config.Dirpaths[slashes] = fmt.Sprintf("%s", f.Name())
    return nil
    fmt.Println(i, match)
}
config.Dirpaths[slashes] = fmt.Sprintf("%s  %s", prename, f.Name())
prenameOld := ""
for k, v := range config.Dirpaths {
    if k != 0 {
        if v != "" {
            if k == slashes {
                break
            }
            prenameOld += v + "\\"
        }
    }
}
oldname := strings.TrimRight(config.Path+prenameOld+f.Name(), "\\")
newName := strings.TrimRight(config.Path+prenameOld+config.Dirpaths[slashes], "\\")
if len(config.OldNames) != config.MaxDir {
    config.OldNames = append(config.OldNames, oldname)
    config.NewNames = append(config.NewNames, newName)
}
return nil
}