Go语言os.Mkdir在Windows创建文件夹报文件名语法错误求助
问题根因
报错的核心原因是跨平台换行符差异导致的非法文件名字符:bufio.Reader.ReadString('\n')在Windows系统下读取用户输入时,返回的字符串末尾会携带\r\n(回车+换行)两个字符,代码没有处理多余的\r(ASCII码13,回车符),而\r属于Windows文件系统明确禁止的文件/文件夹命名字符,直接拼接进文件夹名就会触发语法错误。
你提供的报错日志里,文件夹名20220610133713_TEST后单独换行才出现冒号,就是字符串末尾藏的\r在打印时把光标拉回行首导致的,是这个问题的典型特征。
之前你试了改绝对路径、相对路径都没用,因为问题根本不在路径格式,而在你拼接的hostname字符串末尾藏了不可见的非法控制符。
修复方案
- 读取输入后,统一用
strings.TrimSpace()去除字符串首尾的空格、换行、回车等不可见空白字符,不要手动按固定长度截断,避免跨平台换行符差异带来的兼容问题。
修正后的可运行代码如下:
reader := bufio.NewReader(os.Stdin) fmt.Print("Hostname: ") hostname, _ := reader.ReadString('\n') // 关键步骤:清除首尾的换行、回车、多余空白 hostname = strings.TrimSpace(hostname) now := time.Now().Format("20060102150405") folderName := fmt.Sprintf("%s_%s", now, hostname) err := os.Mkdir(folderName, os.ModePerm) if err != nil { log.Fatal(err) }
- 你之前调用cmd.exe执行mkdir能临时绕过,是因为cmd在解析传入参数时,会自动过滤掉末尾的
\r这类不可见控制符,属于歪打正着,不是规范解决方案,不建议长期使用。 - 额外注意:Windows系统下文件/文件夹名还禁止包含
/ \ : * ? " < > |这几个字符,如果后续输入的hostname可能携带上述字符,还需要额外加一层字符替换过滤,否则依然会触发命名报错。
内容的提问来源于stack exchange,提问作者MeMario
相关产品推荐
相关产品推荐

