.net 如何识别文件名是8.3短文件名

xwbd5t1u  于 2023-01-14  发布在  .NET
关注(0)|答案(5)|浏览(163)

我想知道是否有一个函数,可以识别如果文件名是短文件名(8.3文件名)。我不想文件的完整路径,但只是一种方式来识别给定的文件名是否遵循https://en.wikipedia.org/wiki/8.3_filename约定。所以我的输入函数将只是文件名,我需要输出布尔值是或否。例如:
文件:* 描述. htm *,输出:没有
文件 * 描述~1.htm 描述2~. htm *,输出:是的。

utugiqy6

utugiqy61#

假设你在谈论windows(用短文件名“n”all),你可以用途:获取短路径名称。
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364989(v=vs.85).aspx
然后比较两者。
除非你的字面意思是--这个字符串的格式是8个字符的名称和3个字符的扩展名--在这种情况下,应该很容易计算出来。
为了确定格式,你可以使用regex(在c#中-其他regex是可用的):

Regex r = new Regex(@"^\S{1,8}\.\S{1,3}$");
        r.IsMatch("somefile.ext");

这应该可以让您开始--但是您可能需要稍微修改一下regex字符串。
尝试https://regex101.com/为一个体面的在线regex的东西马鲍勃。

cqoc49vn

cqoc49vn2#

您可以在kernel32.dll中使用GetShortPathName转换为短路径名,然后检查它是否返回相同的字符串。
必须声明以下内容才能访问此函数:

[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern Int32 GetShortPathName(String path, StringBuilder shortPath, Int32 shortPathLength);

然后创建一个StringBuilder并调用GetShortPathName:

StringBuilder shortPath = new StringBuilder(myPath.Length + 1);

PathExtensions.GetShortPathName(myPath, shortPath, shortPath.Capacity);
if (myPath == shortPath.ToString()) {
    //short path name
}
ghhkc1vu

ghhkc1vu3#

你可以这样做:

public static bool Is83(string fileName)
{
    var parts = Path.GetFileName(fileName).Split('.');
    return parts.Length == 2 && parts[0].Length <= 8 && parts[1].Length <= 3;
}
hgc7kmma

hgc7kmma4#

FWIW,这里有一个正则表达式来判断整个路径是否为8.3。

^[A-Z]:\\(?:[^\\ ]{1,8}(?:\.[^\\ ]{1,3})?\\)+[^\\ ]{1,8}(?:\.[^\\ ]{1,3})?$
31moq8wy

31moq8wy5#

修改已接受的答案以剔除无效的非打印字符、空格(0x20)和ASCII范围以上的任何字符,下面是一个正则表达式:

Regex r = new Regex(@"^[\x21-\x2D\x30-\x39\x3B-\x3E\x40-\x5B\x5D-\x7E]{1,8}(\.[\x21-\x2D\x30-\x39\x3B-\x3E\x40-\x5B\x5D-\x7E]{1,3})?$");
r.IsMatch("somefile.ext");

这有点难看,但我认为这是用来检查整个(可选根)路径的正则表达式:

^([A-Za-z]:\\)?([\x21-\x2D\x30-\x39\x3B-\x3E\x40-\x5B\x5D-\x7E]{1,8}(\.[\x21-\x2D\x30-\x39\x3B-\x3E\x40-\x5B\x5D-\x7E]{1,3})?\\)*[\x21-\x2D\x30-\x39\x3B-\x3E\x40-\x5B\x5D-\x7E]{1,8}(\.[\x21-\x2D\x30-\x39\x3B-\x3E\x40-\x5B\x5D-\x7E]{1,3})?$

注意这是可能需要的,因为不幸的是PathExtensions.GetShortPathName不能保证工作。系统卷上有一个属性可以设置为不提供8.3名称。所以如果你真的需要一个8.3名称,这个正则表达式会告诉你是否有。

相关问题