package main
import (
"fmt"
"os"
)
func main() {
f := "D:\\cron"
fmt.Println(os.Stat(f))
fmt.Println(os.Open(f))
f = "D:\\con"
fmt.Println(os.Stat(f))
fmt.Println(os.Open(f))
}
结果如下:
<nil> CreateFile D:\cron: The system cannot find the file specified.
<nil> open D:\cron: The system cannot find the file specified.
<nil> CreateFile D:\con: The parameter is incorrect.
&{0xc000086a00} <nil>
我就是想读取一个文件,我觉得os.Open()应该在文件不存在时返回错误,这样我就可以不多调一次os.Stat()
然而不知为啥会碰到上面这个问,搞不懂“D:\con”这个为啥会是参数错误,而且os.Open竟然返回正常。
有疑问加站长微信联系(非本文作者)

这就尴尬了,要么楼主给Go团队提一个bug?
😂 有空自己试试
问题找到了,可以百度“Windows中不能用con等作为文件名”,我这是碰巧踩了一个大大的坑。
到stackoverflow几分钟出答案,可以百度“Windows中不能用con等作为文件名”,我这是碰巧踩了一个大大的坑。
如果你打开文件的目的是写文件应不应该报错呢?
5楼 @ryanyntc
这是go源码,只读方式打开没法写吧。
我已经放到stackoverflow上求有缘人解释解释点击链接
放到stackoverflow不到几分钟就有答案了,简直可以超神了啊。
可以百度“Windows中不能用con等作为文件名”,我这是碰巧踩了一个大大的坑。
没有 windows 环境,没法试。我本地是没问题
stackoverflow上不到几分钟就有答案点击链接
可以百度“Windows中不能用con等作为文件名”,我这是碰巧踩了一个大大的坑。
这坑,真是可以
问题找到了,可以百度“Windows中不能用con等作为文件名”,我这是碰巧踩了一个大大的坑。
确实,我无意间踩坑,踩的不知所措,苦笑。
@jan-bar 学到了。这种坑可以提交issue.
遇到这个问题的时候,谁tmd会想到这么个坑
我的意思是打开f = "D:\con"这个文件为什么没有报错?得到的第一个返回值不是nil,请问此时这第一个参数能按照预期使用么?
学到了学到了。
第一个返回值的值是nil,难道你还能read()?我没试过,应该可以read,然后read也是读不到什么的!类型肯定还是*File类型,同样也可以调用这个对象下面的方法,但是读取不到任何东西。因为read()方法会进行检查的!如果你传递过的参数是一个nil值,那么肯定不会进行读取了,而是直接抛出“无效参数”的错误!如下:

我明白你的意思了,我自己试了下确实是不可以使用con这个东西,会出现bug:
隔了这么久没想到还有人看这篇帖子。。我就把go源码发上来吧,这是后面阅读源码发现的额。
嗯, 好的, 学到了
1.17 显示找不到的错误,不知道是不是修复了。
不对啊。。我试了1.17的
os.Open("D:\\con")
,err返回的还是nil,这个算是一个注意点吧。路过,学了一招
@jan-bar 我意思是这个修复了, 我报错是没有这个目录, 正常的报错,不是楼主的参数不正确, 有这个目录就不会有错误。