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

news2024/9/19 12:51:48

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

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

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

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

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

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

Delphi 代码示例:

uses
  System.RegularExpressions, System.SysUtils;

function IsValidFileNameOrPath(const AFileName: string): Boolean;
var
  Regex: TRegEx;
  DrivePattern, NetworkPattern, PathPattern: string;
begin
  // 检查文件路径是否为空,是否超过260字符限制
  if (AFileName = '') or (Length(AFileName) > 260) then
    Exit(False);

  // 合法盘符模式,例如 C:\ 或 D:\
  DrivePattern := '^[a-zA-Z]:\\';

  // 网络路径模式,例如 \\server\share
  NetworkPattern := '^\\\\[^<>:"/\\|?*]+\\[^<>:"/\\|?*]+';

  // 文件名和路径的基本合法性检查,排除非法字符和不合法的结尾
  // 该模式允许文件夹和文件名不包含非法字符,文件名或文件夹不能以空格或点结束
  PathPattern := '^(?!.*[\\/]{2,})[^<>:"/\\|?*]+[^ .]$';

  // 检查是否符合盘符路径或者网络路径的格式
  if TRegEx.IsMatch(AFileName, DrivePattern) or TRegEx.IsMatch(AFileName, NetworkPattern) then
  begin
    // 去掉盘符或者网络前缀,剩下的部分检查合法性
    Regex := TRegEx.Create(PathPattern, [roIgnoreCase]);
    
    // 按照目录分割,依次检查每一个路径片段是否合法
    Result := True;
    var Parts := AFileName.Split(['\']);
    for var Part in Parts do
    begin
      if not Regex.IsMatch(Part) then
      begin
        Result := False;
        Break;
      end;
    end;
  end
  else
    Result := False;
end;

procedure TestFileNameValidation;
var
  TestFileName: string;
begin
  TestFileName := 'C:\Program Files\MyApp\data.txt'; // 示例路径
  if IsValidFileNameOrPath(TestFileName) then
    Writeln('文件路径合法')
  else
    Writeln('文件路径不合法');
end;

begin
  TestFileNameValidation;
end.

验证逻辑:

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

解释:

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

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

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

测试用例:

procedure TestFileNameValidation;
begin
  Writeln(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.coloradmin.cn/o/2143239.html

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

相关文章

一文讲懂Mac中的环境变量

你是否曾经因为环境变量配置不当而浪费了宝贵的开发时间?你是否好奇为什么有时候在终端输入命令会提示"command not found",而有时候又能正常运行?如果你是一名Mac用户,并且希望真正掌握环境变量的奥秘,那么这篇文章将为你揭开Mac中环境变量的神秘面纱,帮助你成为一…

BFS 解决边权为1的最短路问题

边权为1的最短路问题 最短路问题&#xff1a; 比如说从D->K&#xff0c;找出最短的那条&#xff0c;其中每条路都是有权值&#xff0c;此篇主要讲解的边权为1的最短路问题。 即边权都是一样的。 解法就是从起点开始&#xff0c;做一次BFS&#xff1a; 需要一个队列、一个…

深入理解IP地址分类及子网划分详解

在互联网时代&#xff0c;IP地址是网络通信的基础。无论是访问网站、发送电子邮件&#xff0c;还是进行数据传输&#xff0c;IP地址都扮演着至关重要的角色。本文将详细解析IP地址的分类及子网划分的原理&#xff0c;帮助你更好地理解网络架构及其应用。 一、什么是IP地址 IP…

通信工程学习:什么是TDMA时分多址

TDMA时分多址 TDMA&#xff08;Time Division Multiple Access&#xff0c;时分多址&#xff09;是一种在无线通信中广泛使用的多址接入技术。它通过将时间划分为不重叠的时间帧&#xff0c;并将每个时间帧进一步划分为多个时隙&#xff0c;每个时隙分配给不同的用户或通信系统…

8.JMeter+Ant(基于工具的实现接口自动化,命令行方式)

一、JMeterAnt&#xff08;基于工具的实现接口自动化&#xff09; 如果想要实现自动化&#xff0c;就必须使用命令行。 1.jmeter命令 -n 使用非界面的方式去执行脚本 -t 指定jmeter的脚本位置 -l 生成jtl报告&#xff0c;可以通过查看结果树来解析 -e 生产html格式的报告 -o …

p14 使用阿里云服务器的docker部署NGINX

拉取NGINX的镜像 这里因为之前已经配置过从阿里云的镜像仓库里面拿镜像所以这里直接就执行docker pull nginx拉取NGINX镜像就OK了 运行NGINX镜像 这里执行docker run -d --name nginx01 -p 3344:80 nginx这里3344是服务器访问的端口80是容器内部的端口&#xff0c;可以看到…

Flask-JWT-Extended登录验证, 不用自定义

"""安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&#xff1…

【贪心】【数据结构-小根堆,差分】力扣2406. 将区间分为最少组数

给你一个二维整数数组 intervals &#xff0c;其中 intervals[i] [lefti, righti] 表示 闭 区间 [lefti, righti] 。 你需要将 intervals 划分为一个或者多个区间 组 &#xff0c;每个区间 只 属于一个组&#xff0c;且同一个组中任意两个区间 不相交 。 请你返回 最少 需要…

vue3 ref的用法及click事件的说明

1、ref可以定义一个简单的属性&#xff0c;也可以是一个复杂的列表、数组等等。 2、为什么要使用 ref&#xff1f;简单的let个变量不行吗&#xff1f;const个变量不行吗&#xff1f; 其实这个跟vue的响应式的系统有关&#xff0c;官方的说明如下&#xff1a; 3、为 ref() 标注…

VMWare中的Centos8:Errors during downloading metadata for repository ‘appstream‘

在VMWare的环境中&#xff0c;安装和部署好Centos8&#xff0c;待设置好网络环境后&#xff0c;安装部署C开发和编译环境&#xff0c;遇到报错&#xff1a; dnf gcc gcc-c -y 解决问题的办法如下, 1. 进入仓库源文件夹&#xff1a;cd /etc/yum.repos.d/ 2. 修改镜像配置{这…

计算机毕业设计 公寓出租系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

Flask-Migrate的使用

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

微信电脑版聊天图片DAT格式文件转为普通JPG图片

1-7 本文章主要教你如何恢复微信聊天中的聊天图片&#xff0c;主要应用场景是&#xff0c;当你的微信被封号了&#xff0c;或者无法登录了&#xff0c;会导致微信聊天中的聊天图片没办法再打开&#xff0c;如果是重要的图片&#xff0c;那就有损失了&#xff0c;所以有了本文的…

【有啥问啥】弱监督学习新突破:格灵深瞳多标签聚类辨别(Multi-Label Clustering and Discrimination, MLCD)方法

弱监督学习新突破&#xff1a;格灵深瞳多标签聚类辨别&#xff08;Multi-Label Clustering and Discrimination, MLCD&#xff09;方法 引言 在视觉大模型领域&#xff0c;如何有效利用海量无标签图像数据是一个亟待解决的问题。传统的深度学习模型依赖大量人工标注数据&…

探索未来游戏边界:AI驱动的开放世界RPG引擎与UGC平台

在游戏产业的浩瀚星空中,一项革命性的技术正悄然升起,它不仅重塑了游戏开发的传统模式,更将玩家的创造力推向了前所未有的高度。今天,让我们一同走进这个由AI驱动的开放世界RPG游戏引擎与UGC(用户生成内容)平台的奇幻世界,探索其背后的无限可能。 产品定位:AI赋能,重…

AE VM5000 Platform VarioMatch Match Network 手侧

AE VM5000 Platform VarioMatch Match Network 手侧

Vue Application exit (SharedArrayBuffer is not defined)

vite配置 export default defineConfig { server: {cors: true, // 启用 CORSheaders: {Cross-Origin-Opener-Policy: same-origin,Cross-Origin-Embedder-Policy: require-corp,cross-origin-resource-policy: cross-origin}}, } 错误处理 报其它错误&#xff0c;如(Compi…

如何在 CentOS 上安装和使用 Neofetch(图文教程)

Neofetch 是一个用来在命令行界面显示系统信息的工具。它可以展示操作系统、内核版本、CPU、内存、桌面环境、主题、图标、终端等信息&#xff0c;并配合 ASCII 艺术图来美化输出。 一、安装步骤 1、添加yum源 curl -o /etc/yum.repos.d/konimex-neofetch-epel-7.repo https:/…

9.9watershed分水岭分割

实验原理 在计算机视觉中&#xff0c;分水岭算法&#xff08;Watershed Algorithm&#xff09;是一种基于形态学的分割方法&#xff0c;常用于图像分割。OpenCV 提供了 cv::watershed 函数来实现这一算法。分水岭算法的主要思想是将图像视为地形表面&#xff0c;其中像素强度值…

水下目标检测数据集 urpc2021

项目背景&#xff1a; 水下目标检测在海洋科学研究、水下考古、海洋资源勘探等多个领域具有重要的应用价值。由于水下环境的复杂性和多变性&#xff0c;传统的人工检测方法存在诸多限制&#xff0c;自动化检测技术的需求日益增加。URPC2021数据集旨在为水下目标检测提供高质量…