通过C#确定字符串是否是有效的文件路径

Dis*_*ive 44 .net c# filesystems validation path

我想知道如何确定字符串是否是有效的文件路径.

文件路径可能存在也可能存在.

Mat*_*hen 56

您可以使用FileInfo构造函数.如果"文件名为空,仅包含空格或包含无效字符",它将抛出ArgumentException.它也可以抛出SecurityException或UnauthorizedAccessException,如果你只关心格式,我认为你可以忽略它.

另一种选择是直接检查Path.GetInvalidPathChars.例如:

boolean possiblePath = pathString.IndexOfAny(Path.GetInvalidPathChars()) == -1;
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这不再适用于 .NET Core / .NET 5+。文档现在显示“ArgumentException:**.NET Framework 和 .NET Core 版本早于 2.1**:文件名为空,仅包含空格,或包含无效字符。” 我已经用 .NET 6 进行了尝试,果然它不会对包含无效字符的路径引发异常。据我所知,这是因为 Linux 对有效文件名的规定比 Windows 更宽松,而且 .NET Core / .NET 现在是跨平台的。 (5认同)
  • FWIW,这将返回误报.您还需要检查权限,并且文件夹/文件名不是非法的文件夹(http://en.wikipedia.org/wiki/DOS#Reserved_device_names). (3认同)
  • @Julien如果你没有传入一个完整的路径,它会把它当作`Directory.GetCurrentDirectory()`返回的相对路径.因此,如果你在`C:\ Temp`中工作并调用`new FileInfo("test");`,``FullName`属性将是`C:\ Temp\test`. (2认同)

Ste*_*fan 22

100%准确地检查路径的字符串格式是非常困难的,因为它将取决于使用它的文件系统(如果不在同一台计算机上,则取决于网络协议).

即使在Windows甚至NTFS中,它也不简单,因为它依赖于.NET .NET在后台使用以与内核通信.

由于目前大多数文件系统都支持unicode,因此可能还需要检查所有规则以进行正确编码的unicode,规范化等.

我要做的只是进行一些基本检查,然后在使用路径后正确处理异常.有关规则,请参阅:


Rox*_*Rox 8

以下是您可能会使用的一些内容:

  • 检查驱动器是否正确(例如,在一台计算机上驱动器X:\存在,但不存在于您的驱动器上):使用Path.IsPathRooted以查看它是否不是相对路径,然后使用驱动器Environment.GetLogicalDrives()来查看您的路径是否包含其中一个有效的驱动器
  • 要检查有效字符,你有两种方法:Path.GetInvalidFileNameChars()Path.GetInvalidPathChars()不完全重叠.您也可以使用Path.GetDirectoryName(path)Path.GetFileName(fileName)输入您的输入名称,如果是,则会引发异常

path参数包含无效字符,为空或仅包含空格.


ata*_*man 5

在您尝试创建该文件之前,您无法真正确定。也许路径有效但安全设置不允许创建文件。唯一可以告诉您路径是否真的有效的实例是操作系统,那么为什么不尝试创建该文件并捕获IOException表明它无效的文件呢?以我的拙见,这是一种方法:假设输入有效,使用它,并IOException在无效时捕获一个。