JS:从string中的path中删除文件名的最佳方法?
我有string格式如下:
path/to/a/filename.txt
现在我想做一些string操作,这使得我可以非常有效地从这段代码中删除“filename.txt”部分。 换句话说,我希望我的string变成这样:
path/to/a/
什么是最有效的方法来做到这一点? 目前我正在分割string,并重新连接除了最后一个单独的元素,但我感觉这是一个真正的,低效的方法来做到这一点。 这是我目前效率低下的代码:
res.getPath = function(file) { var elem = file.split("/"); var str = ""; for (var i = 0; i < elem.length-1; i++) str += elem[i] + "/"; return str; }
使用lastIndexOf()查找最后一个斜杠的位置,并使用substring()获取斜杠前面的部分。
str.substring(0, str.lastIndexOf("/"));
这个怎么样:
"path/to/a/filename.txt".split("/").slice(0, -1).join("/")+"/"
function splitPath(path) { var dirPart, filePart; path.replace(/^(.*\/)?([^/]*)$/, function(_, dir, file) { dirPart = dir; filePart = file; }); return { dirPart: dirPart, filePart: filePart }; }
那里好多了
如果这是从file upload表单处理文件名,则HTML5规范build议使用以下代码:
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 }
参考: http : //www.w3.org/TR/html5/number-state.html#file-upload-state http://www.w3.org/TR/html5/forms.html#file-upload-state – (types=文件)
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; }
用法:
var dir = getDirname(url.parse(request.url).pathname, '/');
。
var dir = getDirname(path.join('foo', 'bar', 'text.txt'), path.sep);
test/dir/lib/file- _09.ege.jpg
– 将被 test/dir/lib/
file- _09.ege.jpg
– 将会是 – 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; } }