在go中制作文件名截断器

Making a filename truncator in go

我是 Go 的新手,我一直在尝试制作一个程序,在其目录中的所有文件的字符“-”之后(包括在内)截断文件名。它不起作用,我不知道我哪里出错了。

func changeFilename() {
    file, err := os.Open(".")
    if err != nil {
        log.Fatalf("failed opening directory: %s", err)
    }
    defer file.Close()

    oldNames, _ := file.Readdirnames(0)

    var s string
    for _, i := range oldNames {
        for _, j := range i {
            for j != '-' {
                k := strconv.QuoteRune(j)
                s += k
                j++
            }
        }
        err := os.Rename(i, s)
        if err != nil {
        log.Fatal("failed to rename: %s", err)
        }
    }
}

我希望在 运行 可执行文件时更改测试目录中的文件名,但他们没有。程序构建时没有任何错误消息。

您的 s 变量应该移到最外层的循环中,因为它的生命周期应该绑定到一个 oldName。一旦遇到非 - 字符,最内层循环就没有退出条件。如果找到 -,那应该是一个带有相应 breakif 语句。至于建立新的文件名,你应该使用 += string(j) 而不是引用符文。

func changeFilename() {
    file, err := os.Open(".")
    if err != nil {
        log.Fatalf("failed opening directory: %s", err)
    }
    defer file.Close()

    oldNames, _ := file.Readdirnames(0)

    for _, i := range oldNames {
        var s string
        for _, j := range i {
            if j != '-' {
                s += string(j)
            } else {
                    break
            }
        }
        err := os.Rename(i, s)
        if err != nil {
        log.Fatal("failed to rename: %s", err)
        }
    }
}

根据您对问题的描述修正您的逻辑:

package main

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

// changeFilename truncates filenames after (and including) the character "-"
// of all files in the directory. File extensions are preserved.
func changeFilename(dir string) {
    file, err := os.Open(dir)
    if err != nil {
        log.Fatalf("failed opening directory: %s", err)
    }
    defer file.Close()

    fis, err := file.Readdir(0)
    if err != nil {
        log.Fatalf("failed reading directory: %s", err)
    }

    for _, fi := range fis {
        if !fi.Mode().IsRegular() {
            continue
        }
        old := fi.Name()
        ext := filepath.Ext(old)
        for i, r := range old[:len(old)-len(ext)] {
            if r == '-' {
                new := old[:i] + ext
                err := os.Rename(old, new)
                if err != nil {
                    log.Fatalf("failed to rename: %s", err)
                }
                fmt.Printf("%q %q\n", old, new)
                break
            }
        }
    }
}

func main() {
    changeFilename(".")
}

输出:

"trunc-ate.typ" "trunc.typ"
"hyp-hen.ext" "hyp.ext"