1

我需要解决的问题是缩短用户给出的文件路径。如果您不知道,有时无法在命令提示符中输入带空格的路径。您需要将路径放在引号中或将带空格的路径重命名为“abcdef~1”。

示例:“C:\Some Folder\Some File.exe”应变为“C:\SomeFo~1\SomeFi~1.exe”(不区分大小写)。

我正在 JavaScript 中创建一个函数来尝试使用这个想法来缩短文件路径。

function ShortenFilePath(FilePath){
    var Sections = FilePath.split("\\")
    for (Index = 0; Index < Sections.length; Index++){
        while (Sections[Index].length > 6 && Sections[Index].match(" ") && !Sections[Index].match("~1")){
            alert(Sections[Index])
            Sections[Index] = Sections[Index].replace(" ","")
            Sections[Index] = Sections[Index].substring(0,6)
            Sections[Index] = Sections[Index] + "~1"
            alert(Sections[Index])
        }
    }
    var FilePath = Sections.join("\\")
    alert(FilePath)
    return FilePath
}

问题是,它会忽略文件扩展名并吐出“C:\SomeFo~1\SomeFi~1”。我需要帮助获取该文件扩展名(可能通过正则表达式)。如果你觉得这个功能可以优化,请分享你的想法。

更新:我相信问题已经解决。

更新2:之前的代码有一些问题,所以我稍微修改了一下。

更新 3:新的新问题。哎呀。如果没有扩展名的文件本身的名称少于 7 个字母,那么它将显示为“name.e~1.exe”。

更新4:我想我终于解决了这个问题。我认为。

function ShortenFilePath(FilePath){
    var Sections = FilePath.split("\\")
    Sections[Sections.length - 1] = Sections[Sections.length - 1].substring(0,Sections[Sections.length - 1].lastIndexOf("."))
    for (Index = 0; Index < Sections.length; Index++){
        while (Index > 0 && Sections[Index].match(" ") && !Sections[Index].match("~1")){
            Sections[Index] = Sections[Index].replace(/ /gm,"")
            Sections[Index] = Sections[Index].substring(0,6) + "~1"
        }
    }
    return Sections.join("\\") + FilePath.substring(FilePath.lastIndexOf("."))
}
4

4 回答 4

0

I would use this to get the extension:

someString.substring(someString.lastIndexOf("."))

you also asked for some code review, so:

1 - Your JS conventions are a little off, it looks more like C# :) Why the capital letter in variable and method names?

2 - You said you can go with the quotes option instead of using ~1, seems easier, why did you decide not to?

3 - Why do you need something like this in your JS?

于 2013-08-27T23:18:41.950 回答
0

这个怎么样:

function ShortenFilePath(FilePath){
    var Sections = FilePath.split("\\")
    var suffix = FilePath.match(/(\..*$)/)
    for (Index = 0; Index < Sections.length; Index++){
        while (Sections[Index].length > 6 && Sections[Index].match(" ") && !Sections[Index].match("~1")){
            alert(Sections[Index])
            Sections[Index] = Sections[Index].replace(" ","")
            Sections[Index] = Sections[Index].substring(0,6)
            Sections[Index] = Sections[Index] + "~1"
            alert(Sections[Index])
        }
    }
    var FilePath = Sections.join("\\") + (suffix? suffix[1] : '')
    alert(FilePath)
    return FilePath
}
于 2013-08-27T23:20:49.663 回答
0

修复更新 #3 问题:

if (FilePath.lastIndexOf(".") > 6){
   Sections[Index] = Sections[Index].substring(0,6) + "~1"
} else {
   Sections[Index] = Sections[Index].substring(0, FilePath.lastIndexOf(".")) + "~1"
}

顺便说一句,这个:

while (Sections[Index].match(" ")){
   Sections[Index] = Sections[Index].replace(" ","")
}

应该看起来像这样:

Sections[Index] = Sections[Index].replace(/ /gm, "");
于 2013-08-28T00:00:59.363 回答
0

您可以使用String.prototype.replace回调:

function ShortenFilePath(FilePath){
    return FilePath.replace(/([^:\\]+)([\\|\.[^\\]+)/g, function(text,match1, match2){
        return match1.length > 8 ? match1.replace(' ', '').substr(0, 6) + '~1' + match2 : match1.replace(' ', '') + match2;
    });    
}

我不是 100% 确定这会完全输出你需要的东西,但可能你明白了 :)
jsFiddle

于 2013-08-27T23:28:55.467 回答