【问题标题】:How to truncate a string (containg a path) without touching the filename?如何在不触及文件名的情况下截断字符串(包含路径)?
【发布时间】:2013-01-13 22:11:00
【问题描述】:

如何在不触及文件名的情况下截断字符串(包含路径)(保留最后一个文件夹、文件名和驱动器号)?

嗨, 我正在寻找一种截断路径以适应指定宽度的方法。

我已经在 SO 上进行了搜索,发现了这个: Truncate a string nicely to fit within a given pixel width

但它在字符串末尾添加 ...。我想有一个类似的功能,但它需要保持开头和结尾..

例如,我有这个路径(字符串):

H:\Informatique\Personnalisation\Icones\__\Crystal GT PNG Pack\Applications\licq.png

它需要像这样适应 div 的宽度:

H:\Informatique\...PNG Pack\Applications\licq.png

另一个例子:

D:\A___VERY___________LONG________PATH____________\myfile.png

将缩短为:

D:\A___VERY___________LONG________PA...\myfile.png

最后一个例子:

D:\A___VERY___________LONG________PATH____________\and-a-sub-solder\myfile.png

将缩短为:

D:\A___VERY________...\and-a-sub-solder\myfile.png

限制:

  • 需要驱动部分(H:)
  • 需要提供文件名和扩展名 (licq.png)
  • 如果有多个文件夹,最后一个文件夹不能被截断,除非所有内容都已被截断,这是唯一的方法 使字符串更短。
  • 如果文件名太长,请在中间截断。

长文件名示例:

D:\my____file___________________________name____is___too____________long.png

将缩短为:

D:\my____file_________..._is___too____________long.png

我看到 windows 和苹果做得很好......但我找不到任何靠近它的脚本。

有类似脚本的链接,我可以尝试调整它吗? 或者任何想帮助我的人? :)

非常感谢

【问题讨论】:

  • 截断长文件名的具体规则有哪些?
  • 对于省略号何时出现在截断的目录/文件名的开头(示例 1)、结尾(示例 2 和 3)或中间(示例 4)是否有规则?跨度>
  • 这只是逻辑,如果我们在末尾截断,用户看不到文件名,在开始时,用户看不到驱动器号。最后一个文件夹通常会告诉用户一些东西...... Program File 对他们中的大多数人来说并不意味着任何东西;) - 如果您想要更多示例,请询问!

标签: jquery string filepath truncate


【解决方案1】:

这是一个有趣的问题,这是我的解决方案:http://jsfiddle.net/AlienHoboken/y7SgA/

它假设你有一个变量 str 里面有路径,maxLength 有你的最大字符长度。

您需要稍微更改代码,因为 str 是硬编码的,您需要更改 maxLength,并且您还需要更改写入信息的位置(它现在只是写入正文)。

注意:如果您的驱动器名称 + 文件名超过了 maxLength 变量,它只会将这两个一起打印出来,即使它们太大了。

代码,以防你不喜欢 jsfiddle:

$(document).ready(function () {
  var str = "H:\\Informatique\\Personnalisation\\Icones\\__\\Crystal GT PNG Pack\\Applications\\licq.png";
  var maxLength = 25;

  var tokens = str.split("\\");
  var drive = tokens[0];
  var fileName = tokens[tokens.length - 1];
  var len = drive.length + fileName.length;
  //remove the current lenth and also space for 3 dots and 2 slashes
  var remLen = maxLength - len - 5;

  //if remLen < 0, then it will over flow our maxLength to still maintain drive and     filename
  if (remLen > 0) {
    //remove first and last elements from the array
    tokens.splice(0, 1);
    tokens.splice(tokens.length - 1, 1);
    //recreate our path
    var path = tokens.join("\\");
    //handle the case of an odd length
    var lenA = Math.ceil(remLen / 2);
    var lenB = Math.floor(remLen / 2);
    //rebuild the path from beginning and end
    var pathA = path.substring(0, lenA);
    var pathB = path.substring(path.length - lenB);
    path = drive + "\\" + pathA + "..." + pathB + "\\" + fileName;

    //write it out
    $("body").html("Orig. Path: " + str + "<br /><br />" +
      "New Path: " + path + "<br /><br />" +
      "MaxLength: " + maxLength + "<br /><br />" +
      "New Length: " + path.length);
  } else {

    //try and fit our maxlength by taking only drive and filename
    $("body").html("Orig. Path: " + str + "<br /><br />" +
      "New Path: " + drive + "\\" + fileName + "<br /><br />" +
      "MaxLength: " + maxLength + "<br /><br />" +
      "New Length: " + (len + 1) + "<br /><br />");
  }
});

【讨论】:

  • 不错!惊人!我将能够从中工作以完成我想要完成的工作。感谢 AlienHoboken 的回答。硬代码不是问题;)
  • 没问题。享受哥们。 =]
  • 非常好的代码,但是如果你有一个像H:\ploppy\licq.png 这样的文件路径,那么你的脚本将产生H:\plopp...loppy\licq.png 这可能不是理想的输出。我想,只需要检查字符串长度是否超过最大长度,如果不是,则返回原样的字符串。
【解决方案2】:

让我添加一点优化版本的@AlienHoboken 的代码。这个版本

  • 适用于字符串开头有或没有驱动器的路径
  • 适用于带有 / 或 \ 分隔符的路径
  • 当我们只需要显示文件夹路径时可以省略文件名

希望对你有帮助!

function pathShorten(str, maxLength, removeFilename) {
    var splitter = str.indexOf('/')>-1 ? '/' : "\\",
        tokens = str.split(splitter), 
        removeFilename = !!removeFilename,
        maxLength = maxLength || 25,
        drive = str.indexOf(':')>-1 ? tokens[0] : "",  
        fileName = tokens[tokens.length - 1],
        len = removeFilename ? drive.length  : drive.length + fileName.length,    
        remLen = maxLength - len - 5, // remove the current lenth and also space for 3 dots and 2 slashes
        path, lenA, lenB, pathA, pathB;    
    //remove first and last elements from the array
    tokens.splice(0, 1);
    tokens.splice(tokens.length - 1, 1);
    //recreate our path
    path = tokens.join(splitter);
    //handle the case of an odd length
    lenA = Math.ceil(remLen / 2);
    lenB = Math.floor(remLen / 2);
    //rebuild the path from beginning and end
    pathA = path.substring(0, lenA);
    pathB = path.substring(path.length - lenB);
    path = drive + splitter + pathA + "..." + pathB + splitter ;
    path = path + (removeFilename ? "" : fileName); 
    //console.log(tokens, maxLength, drive, fileName, len, remLen, pathA, pathB);
    return path;
}

【讨论】:

  • 哇太棒了。当我问这个问题时,有些人笑了,但我上面解释的很简单,它可以防止混淆——它使重要信息保持可见。明天我会试试你的版本,我非常有兴趣测试它。谢谢!
猜你喜欢
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 2011-06-13
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多