石鑫华视觉论坛

 找回密码
 注册会员
查看: 201|回复: 0

[原创] VBAI保存脚本时路径和名称过长时崩溃

[复制链接]
  • TA的每日心情

    昨天 08:43
  • 签到天数: 3372 天

    连续签到: 32 天

    [LV.Master]2000FPS

     楼主| 发表于 2024-6-22 12:21:36 | 显示全部楼层 |阅读模式 来自:广东省东莞市 电信

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x
    VBAI保存脚本时路径和名称过长时崩溃
    image1.png
    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系统的文件名或文件夹到底可以多少字符。
    image2.png
    A~Za~z*5260个字符
    这里直接简单使用A~Za~z这样的大小写字符重复5次得到260个字符,然后复制这些字符先来创建一个文件夹看看:
    image3.png
    文件夹名称
    直接在D盘下创建一个文件夹,然后命名。可以看到5组大小写字符的最后小写字符只有a~j,其他的则被删除了,这时的字符总长是244
    image4.png
    文件夹名称总长244
    image5.png
    算上盘符D:\3个字符
    按照微软上的最大路径长度限制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 个字符的路径字符串”,其中“”表示当前系统代码页的不可见终止 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个字符的脚本文件名。我们来验证一下:
    image6.png
    仅输入7个长度的文件名保存到限长的文件夹中
    image7.png
    可以正常保存
    image8.png
    另存为8个长度的文件名
    image9.png
    8个的文件名仍然可以保存
    8个的文件名仍然可以保存,这时理论上应该是244+3+8+5+1=261个字符了,为什么还可以保存呢?这个系统只是WIN7。应该有限制的吧?那么再加长一些看看呢?
    image10.png
    15个字符的文件名仍然可以保存
    难道这里的文件夹和文件名是分开的判断的?
    image11.png
    260个字符的文件名
    直接使用260个字符的文件名时,直接提示路径过长,提示使用短名称。而且看字符最后的名称,已经被删除了一个字符,并没有z,这里应该是删除了一个结束符吧。最多只能输入259个字符。如果那按照259,再减去.vbai扩展名的5个字符,则应该最多只有254个字符。那先使用254个字符看看:
    image12.png
    254个字符仍然过长
    然后如果保留8.3的默认短名称,则只有242个字符。那么看看242的字符是如何处理的。先看一下243个字符时:
    image13.png
    243个字符仍然越长(这里加上结束符应该是244个?)
    image14.png
    使用242个字符时
    image15.png
    点击Save后不再弹出超长,但是VBAI直接崩溃了
    文件名只保留242个字符时,则可以保存了,但是保存后直接崩溃,无法保存到系统中的文件夹中。
    这里的VBAI应该只判断了输入的文件名长度,限制必须小于等于242个字符。但是并没有考虑文件夹的驱动器等符号。那么直接将其保存到驱动器根目录下呢?
    image16.png
    242个字符直接保存到C:\
    image17.png
    242个字符长的文件名直接在C:\下可以保存
    这时的路径是“C:\ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh.vbai”,总长是251个字符:
    image18.png
    路径长度251个字符
    251个字符,加上一个结束符,有252个字符。
    image19.png
    将其保存到非根目录
    而这个242个字符长度的文件保存到非根目录时也可以保存,这时路径总长已经达到了252+4=256,还可以保存:
    image20.png
    路径总长256时可以保存
    image21.png
    而将其保存到路径总长257的文件夹12345下时则崩溃
    image22.png
    保存到12345文件夹下时崩溃
    所以,这里的路径总长只能是256个字符。
    从上面的验证判断,VBAI中会对脚本的文件名长度进行限制,最长不能超过242个字符(260-12-5-1);而Windows系统则会对文件路径进行限制,最长不超过256个字符。如果VBAI的文件名小于242个字符,而路径总长超过256个字符,则VBAI直接崩溃。

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    LabVIEW HALCON图像处理入门教程(第二版)
    石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
    《LabVIEW Vision函数实例详解》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2024-11-9 02:59

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表