首页 > 解决方案 > Go ReadString 问题:文件名、目录名或卷标语法不正确

问题描述

任何人都可以解决这个问题吗?我认为问题可能出在 readstring() 参数被传递给创建文件函数时。我尝试通过剥离 '\n' 来解决它,但错误仍然存​​在。除了 readstring() 还有其他解决方法吗?因为我认为这是导致问题的原因。谢谢

package main

import (
    "fmt"
    "bufio"
    "log"
    "strings"
    //"io/ioutil"
    "os"
)

func main() {
    fmt.Print("Enter filename to create: ")

    reader := bufio.NewReader(os.Stdin)

    text, _ := reader.ReadString('\n')
    text = strings.TrimSuffix(text, "\n")


    if len(text) > 3 {
        //newFile, err := os.Create(text)
        fmt.Println("Name:"+text)
        createFile(text)
    } else {
        fmt.Println("invalid filename")
    }

}

func createFile(fileName string){
    var newFile *os.File
    var err error


    fmt.Println(fileName)

    newFile, err = os.Create(fileName)
    if err != nil {
        log.Fatal(err)
    }
    newFile.Close()
}

好的,对于那些不熟悉这个问题的人,我已经设法使用 scanf 找到解决方法。所以认为这个问题解决了。

标签: go

解决方案


从基本的调试技术开始:检查错误并检查输入。


代替

text, _ := reader.ReadString('\n')

text, err := reader.ReadString('\n')
if err != nil {
    log.Fatal(err)
}
fmt.Printf("%q\n", text)

例如,

so1.go

package main

import (
    "bufio"
    "fmt"
    "log"
    "strings"
    //"io/ioutil"
    "os"
)

func main() {
    fmt.Print("Enter filename to create: ")

    reader := bufio.NewReader(os.Stdin)

    text, err := reader.ReadString('\n')
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%q\n", text)

    text = strings.TrimSuffix(text, "\n")

    if len(text) > 3 {
        //newFile, err := os.Create(text)
        fmt.Println("Name:" + text)
        createFile(text)
    } else {
        fmt.Println("invalid filename")
    }

}

func createFile(fileName string) {
    var newFile *os.File
    var err error

    fmt.Println(fileName)

    newFile, err = os.Create(fileName)
    if err != nil {
        log.Fatal(err)
    }
    newFile.Close()
}

输出:

>go run so1.go
Enter filename to create: test.file
"test.file\r\n"
Name:test.file
test.file
: The filename, directory name, or volume label syntax is incorrect.
exit status 1

在 Windows 上,该行以“ \r\n”结尾。


代替

text = strings.TrimSuffix(text, "\n")

text = strings.TrimSuffix(text, "\n")
text = strings.TrimSuffix(text, "\r")

例如,

so2.go

package main

import (
    "bufio"
    "fmt"
    "log"
    "strings"
    //"io/ioutil"
    "os"
)

func main() {
    fmt.Print("Enter filename to create: ")

    reader := bufio.NewReader(os.Stdin)

    text, err := reader.ReadString('\n')
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%q\n", text)

    text = strings.TrimSuffix(text, "\n")
    text = strings.TrimSuffix(text, "\r")

    if len(text) > 3 {
        //newFile, err := os.Create(text)
        fmt.Println("Name:" + text)
        createFile(text)
    } else {
        fmt.Println("invalid filename")
    }

}

func createFile(fileName string) {
    var newFile *os.File
    var err error

    fmt.Println(fileName)

    newFile, err = os.Create(fileName)
    if err != nil {
        log.Fatal(err)
    }
    newFile.Close()
}

输出:

>go run so2.go
Enter filename to create: test.file
"test.file\r\n"
Name:test.file
test.file

现在程序可以工作了,删除这个调试语句:

fmt.Printf("%q\n", text)

推荐阅读