在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
。一旦遇到非 -
字符,最内层循环就没有退出条件。如果找到 -
,那应该是一个带有相应 break
的 if
语句。至于建立新的文件名,你应该使用 += 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"
我是 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
。一旦遇到非 -
字符,最内层循环就没有退出条件。如果找到 -
,那应该是一个带有相应 break
的 if
语句。至于建立新的文件名,你应该使用 += 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"