我需要解决的问题是缩短用户提供的文件路径。如果您不知道,有时无法在命令提示符中输入带空格的路径。您需要将路径放在引号中或将带有空格的路径重命名为“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("."))
}
答案 0 :(得分:0)
我会用它来获得扩展名:
someString.substring(someString.lastIndexOf("."))
你还要求进行一些代码审查,所以:
1 - 您的JS约定有点偏差,它看起来更像C#:)为什么变量和方法名称中的大写字母?
2 - 你说你可以使用引号选项而不是使用~1,看起来更容易,为什么你决定不这样做?
3 - 为什么在JS中需要这样的东西?
答案 1 :(得分: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
}
答案 2 :(得分: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
答案 3 :(得分: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, "");