进入文件名截断符

问题描述 投票:0回答:2

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

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

go filenames
2个回答
0
投票

您的s变量应移入最外层循环,因为其寿命应与单个oldName绑定。一旦遇到非-字符,则最里面的循环没有退出条件。如果找到了if,则应该是带有相应break-语句。至于建立新文件名,您应该使用+= 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)
        }
    }
}

0
投票

修正您的逻辑以与问题的描述相对应:

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"
© www.soinside.com 2019 - 2024. All rights reserved.