如何在Adobe AIR中将带路径的文件名转换为短文件名(DOS风格)?

4
如何在Adobe AIR中将带路径的文件名转换为短文件名(DOS风格)?
例如,将下面的路径转换为短文件名:
"C:\Program Files\Common Files\Adobe AIR\Versions\1.0\Resources\Adobe AIR Updater.exe"

to

"C:\PROGRA~1\COMMON~1\ADOBEA~1\VERSIONS\1.0\RESOUR~1\ADOBEA~1.EXE"

有没有算法?

2个回答

2
假设您的文本部分是一个字符串变量,您可以使用“\”作为分隔符来拆分它。然后,您将拥有一个数组,您可以使用该数组来检查每个块是否超过8个字符。在循环数组时,您可以剪掉每个长块的最后几个字符并放置~1。在循环中,您可以逐步向临时变量添加所有这些更改,这将在最后给您最终编辑的结果。

唯一有点棘手的部分是要注意结尾的.exe部分。

因此,如果我是您,我会开始阅读String.split()、String.substring()、for循环、arrays等内容。


有一些更好的技巧可以做到正确。你在这样的路径中看到过 ~2 吗? - alxx
请阅读http://en.wikipedia.org/wiki/8.3_filename,尤其是关于波浪符号的部分。我认为安全地删除额外字符并添加~1是完全可行的。 - Kumsal Obuz
在这种情况下,加1是不安全的,因为存在“未记录的哈希”:“从Windows 2000开始,如果已经存在至少4个文件或文件夹具有相同的前6个字符的短名称,则剥离的LFN将被截断为基本名称的前2个字母(如果基本名称只有1个字母,则为1),后跟从文件名的未记录哈希派生的4个十六进制数字,后跟一个波浪号,后跟一个数字,后跟一个句点“。”,后跟扩展名的前3个字符。” - Maksym
1
我明白了,但是你有多大的可能会有至少4个类似名称的文件呢?http://en.wikipedia.org/wiki/8.3_filename#How_to_convert_a_long_filename_to_a_short_filename 考虑到他的例子和这里描述的伪算法,我建议你尝试一下,看看你的例子是否能成功地转换为短格式。顺便问一下,你为什么需要这样的功能呢?我看到你正在使用文件系统开发AIR应用程序。也许,如果我知道你真正想要实现什么,我可以更有帮助。谢谢。 - Kumsal Obuz

1

以下是我方便的方法:

public static string GetShortPathName(string path)
{
    string[] arrPath = path.Split(System.IO.Path.DirectorySeparatorChar);
    path = arrPath[0];   // drive
    // skip first, ( drive ) and last program name
    for (int i = 1; i < arrPath.Length - 1; i++)                
    {
        string dosDirName = arrPath[i];
        if (dosDirName.Count() > 8)
        {
            dosDirName = dosDirName.Substring(0, 6) + "~1";
        }
        path += System.IO.Path.DirectorySeparatorChar + dosDirName;
    }
    // include program name if any
    path += System.IO.Path.DirectorySeparatorChar + arrPath[arrPath.Length - 1];   
    return path;
 }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接