【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;

总结:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1537638.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾收集器

文章目录 垃圾回收机制Stop-the-World垃圾收集器垃圾收集器分类Serial 收集器Serial Old 收集器ParNew 收集器Parallel Scavenge 收集器Parallel Old 收集器CMS 收集器CMS 收集器缺点 G1 收集器G1 收集器特点G1 收集器的分代理念G1 收集器运作过程 垃圾回收机制 垃圾回收&…

【架构设计】多级缓存:应用案例与问题解决策略

【架构设计】多级缓存&#xff1a;应用案例与问题解决策略 多级缓存系统的工作原理及其在提升应用性能方面的关键作用。通过对比本地缓存与分布式缓存的特点 | 原创作者/编辑&#xff1a;凯哥Java | 分类&#xff1a;架构设计系列教程 多级缓存…

无人机助力智慧农田除草新模式,基于YOLOv10全系列【n/s/m/b/l/x】参数模型开发构建无人机航拍场景下的农田杂草检测识别系统

科技发展到今天&#xff0c;无人机喷洒药物已经不是一件新鲜事情了&#xff0c;在很多高危的工作领域中&#xff0c;比如高空电力设备除冰&#xff0c;电力设备部件传送更换等等&#xff0c;无人机都可以扮演非常出色的作用&#xff0c;前面回到老家一段时间&#xff0c;最近正…

【数电】74161 搭建模 7 计数器(M = 7)

文章目录 前言一、实验原理二、实验过程三、实验结果参考文献 前言 西安电子科技大学数电实验&#xff08;使用了部分老师的 ppt&#xff09; 一、实验原理 74161 的引脚图与功能表 异步清零 同步置数&#xff08;考试的时候也用的这个&#xff09; 二、实验过程 三、实…

C#基于SkiaSharp实现印章管理(7)

印章中的文本主要分为两种&#xff1a;1&#xff09;从左向右水平绘制的文本&#xff1b;2&#xff09;沿指定路径绘制的文本。前者使用SKCanvas的DrawText绘制文本&#xff0c;后者则使用SKCanvas的DrawTextOnPath绘制文本。   针对上述情况&#xff0c;调整SealElement类型…

闯关leetcode——28. Find the Index of the First Occurrence in a String

大纲 题目地址内容 解题代码地址 题目 地址 https://leetcode.com/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 内容 Given two strings needle and haystack, return the index of the first occurrence of needle in haystack, or -1 if …

深度学习-点击率预估-研究论文2024-09-14速读

深度学习-点击率预估-研究论文2024-09-14速读 1. Deep Target Session Interest Network for Click-Through Rate Prediction H Zhong, J Ma, X Duan, S Gu, J Yao - 2024 International Joint Conference on Neural Networks, 2024 深度目标会话兴趣网络用于点击率预测 摘…

鱼类计数与识别系统源码分享

鱼类计数与识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer V…

GAN的损失函数和二元交叉熵损失的对应及代码

以下解释为GPT生成 这里有个问题&#xff0c;使用二元交叉熵&#xff0c;的时候生成器的损失如何体现 看代码 import torch import torch.nn as nn import torch.optim as optim# 设置设备为GPU或CPU device torch.device("cuda" if torch.cuda.is_available() el…

【Java EE】文件IO

Author&#xff1a;MTingle major:人工智能 --------------------------------------- Build your hopes like a tower! 目录 一、文件是什么&#xff1f; 二、针对文件系统操作的API 1.文件路径&#xff0c;文件名&#xff0c;文件是否存在 2. 创建文件 3.删除文件&#…

软考中级软件设计师——数据结构与算法基础学习笔记

软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构&#xff08;存储结构&#xff09; 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所…

Flask-SQLAlchemy一对多 一对一 多对多关联

一. 组织一个 Flask 项目通常需要遵循一定的结构&#xff0c;以便代码清晰、可维护。下面是一个典型的 Flask 项目结构&#xff1a; my_flask_app/ │ ├── app/ │ ├── __init__.py │ ├── models.py │ ├── views.py │ ├── forms.py │ ├── tem…

【Matlab 肌电信号分析】

一、数据预处理 1.1 数据读取 使用matlab从rhd文件中读取原始数据&#xff0c;共64个通道。 1.2 数据滤波 使用 60Hz的Notch filter 和150Hz的高通Butterworth滤波器进行降噪 二、波峰提取 > 每个通道分别根据相应的规则提取出波峰、波谷附近的波形。 三、信号聚类 3.1 降…

Postman接口测试、Python接口自动化测试

接口自动化测试笔记&#xff0c;自用 来源&#xff1a;https://www.bilibili.com/video/BV1Cs4y1C73Hp45&vd_source37bf552472afa993fb78c918d1dea2bc 目录 一、Postman接口测试 1.postman自动关联 1&#xff09;创建环境并选择 2&#xff09;使用自动关联技术&#xf…

iPhone 上丢失了重要的联系人?如何恢复已删除的 iPhone 联系人

丢失 iPhone 上的联系人可能会带来灾难。无论是一份很棒的新工作机会、潜在的恋爱对象&#xff0c;还是您一直想打电话的老朋友&#xff0c;如果您打开“联系人”应用时看到空白&#xff0c;这绝不是好事。不过&#xff0c;一切并非全无&#xff0c;仍然可以通过备份或专业软件…

月薪14K的网安公司,来做一下笔试题呀~

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 网络安全简介…

【Linux】基础IO认识(2)

基础IO认识&#xff08;2&#xff09; 1、补充系统调用1、1、read调用1、2、stat 2、重定向2、1、文件描述符的分配规则2、2、实现重定向(dup2) 3、缓冲区的理解3、1、缓冲区典型实例3、2、缓冲区代码形式展示 4、深化和实践利用4、1、在shell中加入重定向4、2、简单实现库的封…

模拟火车世界5/Train Sim World 5 (容量289GB)百度网盘下载

版本介绍 Build.15665692|容量289GB|官方简体中文|支持键盘.鼠标.手柄 游戏介绍 来《模拟火车世界5》里&#xff0c;全世界的铁路尽属于你&#xff01;在标志性的特色城市中&#xff0c;驾驶列车穿越铁轨&#xff0c;飞驰在 3 条全新线路上&#xff0c;用新的角色迎接新的挑战…

教师薪酬管理系统的设计与实现

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;老师信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足广…

【FreeRL】Rainbow_DQN的实现和测试

文章目录 前言环境1 PER note2 C51 note3 Noisy note4 Rainbow note其他 前言 具体代码实现见&#xff1a;https://github.com/wild-firefox/FreeRL/blob/main/DQN_file/DQN_with_tricks.py 将其中所有的trick都用上即为Rainbow_DQN。 效果如下&#xff1a;&#xff08;学习曲…