web-dev-qa-db-fra.com

JS: Le moyen le plus optimisé pour supprimer un nom de fichier d'un chemin dans une chaîne?

J'ai des chaînes formatées comme suit:
path/to/a/filename.txt

Maintenant, j'aimerais faire quelques manipulations de chaîne qui me permettent de supprimer très efficacement la partie "filename.txt" de ce code. En d'autres termes, je veux que ma chaîne devienne ceci:
path/to/a/

Quel est le moyen le plus efficace de le faire? Actuellement, je coupe la chaîne et je reconnecte les éléments séparés, à l’exception du dernier, mais j’ai l’impression que c’est une façon vraiment TRÈS inefficace de le faire. Voici mon code actuel et inefficace:

res.getPath = function(file)
{
  var elem = file.split("/");
  var str = "";
  for (var i = 0; i < elem.length-1; i++)
    str += elem[i] + "/";
  return str;
}
49
DaVince

Utilisez lastIndexOf () pour trouver la position de la dernière barre oblique et obtenez la partie avant la barre oblique avec substring ().

str.substring(0, str.lastIndexOf("/"));
98
Kees de Kooter

Que dis-tu de ça:

"path/to/a/filename.txt".split("/").slice(0, -1).join("/")+"/"
9
Gumbo
function splitPath(path) {
  var dirPart, filePart;
  path.replace(/^(.*\/)?([^/]*)$/, function(_, dir, file) {
    dirPart = dir; filePart = file;
  });
  return { dirPart: dirPart, filePart: filePart };
}

là c'est mieux

0
Pointy
function getDirname(pathname, separator) {
    var parts = pathname.split(separator);
    if (parts[parts.length - 1].indexOf('.') > -1) {
        return parts.slice(0, -1).join(separator)
    }
    return pathname;
}

Usage:

var dir = getDirname(url.parse(request.url).pathname, '/');

.

var dir = getDirname(path.join('foo', 'bar', 'text.txt'), path.sep);
0
André Fiedler

S'il s'agit de traiter un nom de fichier à partir d'un formulaire de téléchargement de fichier, la spécification HTML5 recommande le code suivant:

function extractFilename(path) {
  if (path.substr(0, 12) == "C:\\fakepath\\")
    return path.substr(12); // modern browser
  var x;
  x = path.lastIndexOf('/');
  if (x >= 0) // Unix-based path
    return path.substr(x+1);
  x = path.lastIndexOf('\\');
  if (x >= 0) // Windows-based path
    return path.substr(x+1);
  return path; // just the filename
}

Référence: http://www.w3.org/TR/html5/number-state.html#file-upload-statehttp://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file)

0
Grodriguez

test/dir/lib/file- _09.ege.jpg - Sera pour - test/dir/lib/

file- _09.ege.jpg - Sera pour - file- _09.ege.jpg

    console.log("test - "+getPath('test/dir/lib/file- _09.ege.jpg'));

    function getPath(path){
        path = path.match(/(^.*[\\\/]|^[^\\\/].*)/i);
        if(path != null){
            return path[0];
        }else{
            return false;
        }            
    }

console.log("test - "+getPath('test/dir/lib/file- _09.ege.jpg'));

        function getPath(path){
            path = path.match(/(^.*[\\\/]|^[^\\\/].*)/i);
            if(path != null){
                return path[0];
            }else{
                return false;
            }            
        }