Создание усечения имени файла в go - PullRequest
0 голосов
/ 05 октября 2019

Я новичок в 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)
        }
    }
}

Я ожидал, что имена файлов в тестовой директории будут изменены при запуске исполняемого файла, но они этого не сделали. Программа строит без каких-либо сообщений об ошибках.

Ответы [ 2 ]

1 голос
/ 05 октября 2019

Исправление вашей логики, чтобы соответствовать вашему описанию проблемы:

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"
0 голосов
/ 05 октября 2019

Ваша переменная 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)
        }
    }
}
...