问题
今天,不,应该是前几天加班时就遇到了一个问题。
删文件的时候,本来是想删除素材文件及子文件下面的 raw 文件,用 del /s *.raw,会顺带着把 *.rawMIPI 也删掉了。确认过好几次,没有打错,路径是 C:\CSample\1008\1552829255570\1552829255570_3008x2256_000.RAWMIPI
这样子,在文件夹 C:\CSample\1008 下面执行的命令。
今天终于有点空了,在 CppTemplateTutoria 群里面问了一下,大家第一反应是不可能。然后猜测可能跟通配符有关,想着验证一下,就在 G 盘建立了个文件夹,大概如下面:
1 | G: |
然后再目录 123 下面执行 del /s *.a,发现并没有问题,B.ab 不会被删。在群里说了一声可能自己哪里弄错了,就没管这个事了。
下午的时候不小心,又删了一次,发现素材里面的 RAWMIPI 还是会被删,就决定必须想办法了。
显示把素材复制一份到 G 盘,执行类似操作,发现没问题。于是想,难道只有 C 盘才能复现?于是在 C 盘建立上述 G 盘的 123 目录,执行操作,B.ab 还是不会被删。
这是,想到难不成跟文件后缀有关,遂改名 A.a -> A.raw / B.ab -> B.RAWMIPI,尝试,B.RAWMIPI 仍然没事。
可能跟文件名有关?于是尝试了下图这样,里面的文件名就跟上图类似。删除,果然 RAWMIPI 一起被删了。
把相关截图发到群里之后,大神一句话总结原因:DOS 8.3 余孽……
8.3 短名称
复制自维基百科:
8.3 文件名是一种文件名规范,它主要运用于 FAT 文件系统中。其后继者 NTFS 文件系统也支持 8.3 文件名。这种规范之所以被称为“8.3”,是因为其文件名的特殊格式:文件名的主体部分最多只能包含 8 个字符,而文件扩展名最多只能包含 3 个字符。二者之间用“.”相连。8.3 文件名的目录和文件名都仅使用大写字母,但 DOS 和命令提示符都不大小写敏感(当然,如果使用 UNIX 或类 Unix 等一般大小写敏感的操作系统,则应注意)。
8.3 文件名必须包含主体文件名,但不必须包含扩展名,二者之间用“.”相连。但是如果输入“.”后没有输入扩展名,则“.”没有意义,会被忽略。比如
12345678.会被系统保存为12345678。
更详细的可以网上搜索,具体就是文件系统的历史遗留问题。具体表现就是一个文件如果文件名太长,那么文件系统会给它另外一个 8+3 样式的名字:文件名 8 个字符 + 扩展名 3 个字符。比如 Windows 7 的时候有时看到的程序文件夹 Progame Files 的别名 PROGRA~1 就是这个东西。
以上面为例,.raw 和 .RAWMIPI 对于这样的文件系统来说是同一个后缀(Windows 不区分大小写),所以全都给删了。
另外,看论坛上说,从 Windows 8 开始,默认只在系统盘启用 8dot3 文件格式,所以这个现象在我的 G 盘并不能复现。

可以使用 fsutil.exe 来修改磁盘卷上 8dot3name 的开启与否。使用参数 query 和 set 分别查询和修改。根据微软的说法,启用的话可能会降低目录枚举性能。另外,改了之后可能有些软件在注册表里面存的这种短名路径会出问题,可以先用参数 scan 扫描一下。
不管了,先禁用再说。
杂谈
hexo 引用图片真是麻烦啊,要么渲染不出来,要么 Typora 里面显示不出来。看了很多文章,很多推荐 hexo-asset-image 的根本就没用,有些说了原因但是方法也太复杂。最终找到了一个插件 hexo-image-link,终于能用了。这里的能用表示:
可以在 Typora 里面,按照 Markdown 的标准语法,正常插入及显示图片。
hexo.cmd g生成网页或者hexo.cmd s本地渲染后,网页上也可以正常显示图片。
看代码也就 20 行左右。当然作为一个 JavaScript 小白,我不想去关心插件怎么替换路径的 😅。