6

ファイル名に触れずに文字列 (パスを含む) を切り詰める方法 (最後のフォルダー、ファイル名、ドライブ文字を保持する)?

こんにちは、指定された幅に合わせてパスを切り詰める方法を探しています。

私はすでにSOを検索しましたが、これを見つけました: 指定されたピクセル幅に収まるように文字列を適切に切り捨てます

しかし、文字列の最後に ... を追加しています。同様の機能が欲しいのですが、最初と最後を維持する必要があります..

たとえば、次のパス (文字列) があります。

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 と Apple がうまくやっているのを見ますが、それに近いスクリプトが見つかりません。

同様のスクリプトとのリンクがあるので、調整してみてください。または、それを手伝ってくれる人はいますか?:)

どうもありがとうございました

4

2 に答える 2

4

これは興味深い問題です。これが私の解決策です: http://jsfiddle.net/AlienHoboken/y7SgA/

パスを含む変数 str と、最大文字長を含む maxLength があると想定しています。

str はハードコードされているため、コードを少し変更する必要があります。maxLength を変更する必要があります。また、情報を書き込む場所も変更する必要があります (現時点では body に書き込むだけです)。

注: ドライブ名 + ファイル名が maxLength 変数を超える場合、それらが大きすぎる場合でも、それら 2 つが一緒に出力されます。

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 />");
  }
});
于 2013-01-13T22:53:04.517 に答える