我是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)
        }
    }
}

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

最佳答案

修改逻辑以与问题描述相对应:

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"

10-07 19:23
查看更多