Windows系统下\.txt特殊文件无法被常规方式查看的原理问询
底层原理说明
这一现象完全是Windows的路径解析规则导致的,和文件系统的隐藏特性无关:
- 首先明确你代码中路径的实际值:C++字符串字面量里的转义规则会把
"\\.txt"转换为实际的\.txt(仅开头带1个反斜杠的.txt字符串)传给Windows文件操作API。 - 为什么
a\.txt这类带反斜杠的文件名无法创建:Windows系统中反斜杠\是固定的路径分隔符,只要路径中出现反斜杠,系统就会将其前后内容识别为目录、文件的层级关系。a\.txt会被系统解析为「在当前目录的a子目录下创建.txt文件」,如果当前目录下不存在a子目录,创建操作自然会失败。 - 为什么
\.txt可以创建但你在当前目录找不到:Windows对路径做规范化解析时,若路径满足「开头是单个反斜杠、无前缀盘符、开头没有两个连续反斜杠(UNC路径或Win32设备命名空间的标识)」三个条件,会将其判定为根相对路径,最终解析为「当前程序运行所在盘符的根目录下的对应文件」。
比如你在D:\projects\test目录下运行这段代码,你以为你创建的是当前目录下的文件,但实际创建的是D:\.txt,存放在D盘根目录。 - 为什么bash中
ls -lia看不到文件:你使用的是WSL环境的bash,Windows盘符默认会被挂载到/mnt/[盘符]/路径下。你在当前项目对应的目录(比如/mnt/d/projects/test)执行ls,自然看不到存放在盘符根目录/mnt/d/下的.txt文件,你切换到对应盘符的根目录执行ls就能找到该文件。 - 为什么代码可以正常读写:你读写文件时传入的还是同样的
\.txt路径,系统每次都会解析到盘符根目录下的对应文件,所以读写操作都能正常执行,和文件实际存放的目录无关。
内容的提问来源于stack exchange,提问作者Reid Moffat
相关产品推荐
相关产品推荐

