VBAI保存脚本时路径和名称过长时崩溃
VBAI保存脚本时路径和名称过长时崩溃视频号
VBAI保存脚本时路径和名称过长时崩溃B站
使用Windows操作系统时,一般对于文件名(包含路径、扩展名等)的长度是有限制的。一般好像是限制为256个字符(从微软官方介绍来看,Win10 1607之前的版本,Max Path变量是260个字符限制https://learn.microsoft.com/zh-cn/windows/win32/fileio/naming-a-file),但是无论255还是260个字符,都是长度限制的。
在使用VBAI软件时,保存脚本时,也会遇到这个问题。如果是因为文件夹层数太多导致长度超过长度限制,那么在保存脚本时,则VBAI直接崩溃,这种情况需要注意,因为崩溃后脚本就没有了,数据会丢失,无法恢复;而如果文件夹很短,如直接在盘符下,而直接输入超长的文件名,那么是可以提示非法文件名的。但是这时就算删除一些字符后,文件名长度符合要求了,可以保存时点击Save保存时,仍然有崩溃风险,因为这里的文件名长度计算并没有考虑扩展名。
这里先来验证一下Windows系统的文件名或文件夹到底可以多少字符。
A~Za~z*5共260个字符
这里直接简单使用A~Za~z这样的大小写字符重复5次得到260个字符,然后复制这些字符先来创建一个文件夹看看:
文件夹名称
直接在D盘下创建一个文件夹,然后命名。可以看到5组大小写字符的最后小写字符只有a~j,其他的则被删除了,这时的字符总长是244:
文件夹名称总长244
算上盘符D:个字符
按照微软上的最大路径长度限制https://learn.microsoft.com/zh-cn/windows/win32/fileio/maximum-file-path-limitation?tabs=registry上的内容介绍:在 Windows API ((以下段落) 中介绍的一些例外情况)中,路径的最大长度为 MAX_PATH,定义为 260 个字符。 本地路径按以下顺序构建:驱动器号、冒号、反斜杠、用反斜杠分隔的名称组件以及终止 null 字符。 例如,驱动器 D 上的最大路径为“D:some 256 个字符的路径字符串<NUL>”,其中“<NUL>”表示当前系统代码页的不可见终止 null 字符。 (此处使用的字符 <> 是为了直观明了,不能是有效路径 string 的一部分。)……使用 API 创建目录时,指定的路径不能太长,无法追加 8.3 文件名 (即目录名称不能超过 MAX_PATH 减 12) 。
也就是最大路径长度是260,还要留下DOS保留的8.3文件名,最长只能是260-12=248个字符。所以上面创建的文件夹目录则是244+3+1=248个字符。
这时的文件夹长度总共有248个字符了。那么保存的VBAI脚本,则最长只能使用12个字符,.vbai扩展名去掉5个字符,这时最多只能7个字符的脚本文件名。我们来验证一下:
仅输入7个长度的文件名保存到限长的文件夹中
可以正常保存
另存为8个长度的文件名
8个的文件名仍然可以保存
8个的文件名仍然可以保存,这时理论上应该是244+3+8+5+1=261个字符了,为什么还可以保存呢?这个系统只是WIN7。应该有限制的吧?那么再加长一些看看呢?
15个字符的文件名仍然可以保存
难道这里的文件夹和文件名是分开的判断的?
260个字符的文件名
直接使用260个字符的文件名时,直接提示路径过长,提示使用短名称。而且看字符最后的名称,已经被删除了一个字符,并没有z,这里应该是删除了一个结束符吧。最多只能输入259个字符。如果那按照259,再减去.vbai扩展名的5个字符,则应该最多只有254个字符。那先使用254个字符看看:
254个字符仍然过长
然后如果保留8.3的默认短名称,则只有242个字符。那么看看242的字符是如何处理的。先看一下243个字符时:
243个字符仍然越长(这里加上结束符应该是244个?)
使用242个字符时
点击Save后不再弹出超长,但是VBAI直接崩溃了
文件名只保留242个字符时,则可以保存了,但是保存后直接崩溃,无法保存到系统中的文件夹中。
这里的VBAI应该只判断了输入的文件名长度,限制必须小于等于242个字符。但是并没有考虑文件夹的驱动器等符号。那么直接将其保存到驱动器根目录下呢?
242个字符直接保存到C:下
242个字符长的文件名直接在C:下可以保存
这时的路径是“C: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh.vbai”,总长是251个字符:
路径长度251个字符
251个字符,加上一个结束符,有252个字符。
将其保存到非根目录
而这个242个字符长度的文件保存到非根目录时也可以保存,这时路径总长已经达到了252+4=256,还可以保存:
路径总长256时可以保存
而将其保存到路径总长257的文件夹12345下时则崩溃
保存到12345文件夹下时崩溃
所以,这里的路径总长只能是256个字符。
从上面的验证判断,VBAI中会对脚本的文件名长度进行限制,最长不能超过242个字符(260-12-5-1);而Windows系统则会对文件路径进行限制,最长不超过256个字符。如果VBAI的文件名小于242个字符,而路径总长超过256个字符,则VBAI直接崩溃。