2010-02-02 11 views
40

que tienen cadenas formateadas como sigue:
path/to/a/filename.txtJS: ¿La forma más optimizada para eliminar un nombre de archivo de una ruta en una cadena?

Ahora me gustaría hacer algo de manipulación de cadenas que me permite eliminar de manera muy eficiente la parte "archivo.txt" de este código. En otras palabras, quiero que mi cadena se convierta en la siguiente:
path/to/a/

¿Cuál es la forma más eficiente de hacerlo? Actualmente estoy dividiendo la cadena y volviendo a conectar los elementos separados, excepto el último, pero tengo la sensación de que esta es una manera REALMENTE ineficiente de hacerlo. Aquí está mi actual, el código ineficiente:

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

Muy similar: http://stackoverflow.com/questions/2161511 – Gumbo

+0

'split' es realmente muy rápido, pero definitivamente no es la forma * más rápida * ... – RedFilter

Respuesta

81

Uso lastIndexOf() para encontrar la posición de la última barra y obtener el parte antes de la barra inclinada con subcadena().

str.substring(0, str.lastIndexOf("/")); 
+0

Corto, y funciona. ¡Gracias! No puedo creer que no haya pensado en usar lastIndexOf()! – DaVince

+1

Tenga en cuenta que esto devolverá una cadena con el nombre de archivo en URLs como esta: 'http: //example.com/index.php? P = about/location' o' http: //ex.co/#/14185' – Kroltan

+1

Las barras diagonales hacia adelante en los parámetros de URL deberían estar codificadas en la URL. –

10

¿Qué tal esto:

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

ahí que es mejor

+0

Estoy usando JS fuera de un navegador, y está dando me a "SyntaxError: clase de caracteres sin terminar [" – DaVince

1

Si esto es procesar un nombre de archivo de un formulario de carga de archivos, la especificación HTML5 recomienda el siguiente código:

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 
} 

Referencia: http://www.w3.org/TR/html5/number-state.html#file-upload-state http://www.w3.org/TR/html5/forms.html#file-upload-state-(type=file)

0
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; 
} 

Uso :

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

.

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

test/dir/lib/file- _09.ege.jpg - será la de - test/dir/lib/

file- _09.ege.jpg - será la de - 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; 
 
      }    
 
     }

Cuestiones relacionadas