当前位置: 首页 > news >正文

【delphi】正则判断windows完整合法文件名,包括路径

Delphi 中,可以使用正则表达式来检查 Windows 文件名称或路径是否合法。合法的文件名和路径要求符合以下几点:

  1. 禁止的字符:文件名和路径不能包含以下字符:<, >, :, ", /, \, |, ?, *
  2. 文件名不能以空格或点结束
  3. 长度限制:文件名最长为 255 个字符,路径最长为 260 个字符。

要更严格地检查 Windows 文件路径的合法性,除了排除不允许的字符外,还需要加入对以下情况的检测:

  1. 连续两个反斜杠(\) 在路径中是不合法的。
  2. 合法的盘符:路径应该以合法的盘符开头(如 C:\ 等),或者是以网络路径 \\ 开头。
  3. 路径中的每个文件夹名也应合法:即每个文件夹名不能包含非法字符、不能以空格或点结束。

为了实现以上点,可以利用正则表达式并添加一些额外的逻辑处理。以下是解决方案。

  • 首先检查路径长度是否符合要求(文件名最长 255 字符,路径最长 260 字符)。
  • 然后使用正则表达式来匹配文件名,确保不含非法字符并且文件名的最后一个字符不能是空格或点。

Delphi 代码示例:

usesSystem.RegularExpressions, System.SysUtils;function IsValidFileNameOrPath(const AFileName: string): Boolean;
varRegex: TRegEx;DrivePattern, NetworkPattern, PathPattern: string;
begin// 检查文件路径是否为空,是否超过260字符限制if (AFileName = '') or (Length(AFileName) > 260) thenExit(False);// 合法盘符模式,例如 C:\ 或 D:\DrivePattern := '^[a-zA-Z]:\\';// 网络路径模式,例如 \\server\shareNetworkPattern := '^\\\\[^<>:"/\\|?*]+\\[^<>:"/\\|?*]+';// 文件名和路径的基本合法性检查,排除非法字符和不合法的结尾// 该模式允许文件夹和文件名不包含非法字符,文件名或文件夹不能以空格或点结束PathPattern := '^(?!.*[\\/]{2,})[^<>:"/\\|?*]+[^ .]$';// 检查是否符合盘符路径或者网络路径的格式if TRegEx.IsMatch(AFileName, DrivePattern) or TRegEx.IsMatch(AFileName, NetworkPattern) thenbegin// 去掉盘符或者网络前缀,剩下的部分检查合法性Regex := TRegEx.Create(PathPattern, [roIgnoreCase]);// 按照目录分割,依次检查每一个路径片段是否合法Result := True;var Parts := AFileName.Split(['\']);for var Part in Parts dobeginif not Regex.IsMatch(Part) thenbeginResult := False;Break;end;end;endelseResult := False;
end;procedure TestFileNameValidation;
varTestFileName: string;
beginTestFileName := 'C:\Program Files\MyApp\data.txt'; // 示例路径if IsValidFileNameOrPath(TestFileName) thenWriteln('文件路径合法')elseWriteln('文件路径不合法');
end;beginTestFileNameValidation;
end.

验证逻辑:

  1. 盘符检查:通过正则表达式 ^[a-zA-Z]:\\ 来验证是否以合法的盘符开头(如 C:\D:\)。
  2. 网络路径检查:通过正则表达式 ^\\\\[^<>:"/\\|?*]+\\[^<>:"/\\|?*]+ 来验证网络路径是否合法(如 \\Server\Share)。
  3. 路径片段检查:将整个路径按照 \ 拆分为多个部分,逐个检查每个部分(文件夹和文件名)的合法性。使用正则表达式 ^(?!.*[\\/]{2,})[^<>:"/\\|?*]+[^ .]$ 来确保:
    • 不能包含非法字符。
    • 不允许连续的反斜杠(\\)。
    • 不能以空格或点结束。

解释:

  • 盘符和网络路径正则表达式

    • ^[a-zA-Z]:\\:用于检查以合法盘符开头的路径。
    • ^\\\\[^<>:"/\\|?*]+\\[^<>:"/\\|?*]+:用于检查网络路径,确保合法的服务器和共享文件夹名称。
  • 路径合法性正则表达式

    • ^(?!.*[\\/]{2,}):负向先行断言,确保没有连续的反斜杠或正斜杠。
    • [^<>:"/\\|?*]+[^ .]$:确保文件夹和文件名不包含非法字符,且不能以空格或点结尾。

测试用例:

procedure TestFileNameValidation;
beginWriteln(IsValidFileNameOrPath('C:\valid\path\file.txt'));  // 合法Writeln(IsValidFileNameOrPath('C:\invalid\\path\file.txt'));  // 不合法 - 连续的反斜杠Writeln(IsValidFileNameOrPath('C:\invalid|path\file.txt'));  // 不合法 - 包含非法字符 '|'Writeln(IsValidFileNameOrPath('\\server\share\file.txt'));   // 合法 - 网络路径Writeln(IsValidFileNameOrPath('\\server\\invalid\file.txt'));  // 不合法 - 连续的反斜杠Writeln(IsValidFileNameOrPath('C:\invalidpath\file.'));  // 不合法 - 文件名以点结尾
end;

总结:

这段代码通过严格的正则表达式和逻辑检查文件名和路径的合法性。它确保了路径中的每个片段都不会有非法字符、连续的反斜杠,并且合法的文件名不会以空格或点结尾。如果你想进一步增加其他规则(如长度、特殊情况),可以在此基础上进行扩展。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【深度学习】深度学习模型的加密及解密方案及源码
  • Python爬虫使用实例-umei
  • php环境搭建教程
  • Linux快速安装ClickHouse
  • P1495 【模板】中国剩余定理(CRT)/ 曹冲养猪
  • Iframe窗口通信
  • CentOS上使用Mosquitto实现Mqtt主题消息发布和订阅mqtt主题消息连同时间戳记录到文件
  • 爬虫的流程
  • 【Docker】Docker 常见问题及解决方案
  • MyBatis-Plus 分页插件
  • Gitee基本指令操作
  • 华硕电脑用U盘方式重装系统
  • 【iOS】push和pop、present和dismiss
  • 记某学校小程序漏洞挖掘
  • 13年408计算机考研-计算机网络
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Less 日常用法
  • SQL 难点解决:记录的引用
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 类orAPI - 收藏集 - 掘金
  • 深度学习中的信息论知识详解
  • 学习笔记:对象,原型和继承(1)
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 一天一个设计模式之JS实现——适配器模式
  • 国内开源镜像站点
  • 交换综合实验一
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • (C#)if (this == null)?你在逗我,this 怎么可能为 null!用 IL 编译和反编译看穿一切
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (搬运以学习)flask 上下文的实现
  • (笔试题)合法字符串
  • (二)pulsar安装在独立的docker中,python测试
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (附源码)php新闻发布平台 毕业设计 141646
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (全注解开发)学习Spring-MVC的第三天
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (未解决)macOS matplotlib 中文是方框
  • (一)VirtualBox安装增强功能
  • (转)EOS中账户、钱包和密钥的关系
  • .form文件_SSM框架文件上传篇
  • .Net CF下精确的计时器
  • .NET MVC第三章、三种传值方式
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 设计模式—适配器模式(Adapter Pattern)