从文件路径或URL中获取目录

25

我想获取一个文件的目录位置,但是我不知道该如何获取。我似乎找不到可以实现这一点的模块。

比如说,假设我有这个字符串:

/this/is/a/path/to/a/file.html

我该如何获得这个:

/this/is/a/path/to/a
我知道我可以使用类似这样的东西:

path.substr(0, path.lastIndexOf("/") - 1);

但我不确定那是否像内置于Node中的一些方法那样好。

我还尝试过:

var info = url.parse(full_path);
console.log(info);

结果不是我所需要的,它包括文件名在内的完整路径。

那么,Node.js内置了什么可以做到这一点并且做得很好吗?


1
https://dev59.com/U2Ij5IYBdhLWcg3w24oF - user2879041
1
那正好跟我的需求相反。我需要路径而不是文件名。 - Get Off My Lawn
如果您查看了答案并单击了文档,则链接上方的函数就是您要查找的函数。 - user2879041
7个回答

34

使用 node.js 的 path 模块:

path.dirname('/this/is/a/path/to/a/file');

返回值

'/this/is/a/path/to/a'

2
它实际上返回/this/is/a/path/to/a,但不包括最后的/ - josemmo
1
path.dirname('/this/is/a/path/to/a/directory/') 返回 '/this/is/a/path/to/a',但这明显是一个完整的目录。该函数存在一个错误。注意:路径可以是目录、单独的文件或目录+文件。 - TamusJRoyce
2
@TamusJRoyce 我不认为这是一个错误。它反映了UNIX dirname命令的行为。请参见https://linux.die.net/man/1/dirname。 - Hypaethral
记录在案。Bash-complete似乎会自动补全以/结尾的目录,这就是我的困惑所在。我不确定如何将其提交进行手册审核。 - TamusJRoyce

26

使用纯JS,此代码将有效:

var e = '/this/is/a/path/to/a/file.html'
e.split("/").slice(0,-1).join("/")  //split to array & remove last element

//result: '/this/is/a/path/to/a'

或者... 如果您更喜欢一行代码(使用正则表达式):

"/this/is/a/path/to/a/file.html".replace(/(.*?)[^/]*\..*$/,'$1')

//result: '/this/is/a/path/to/a/'

或……最后,还有那种老式但更快的方法:

var e = '/this/is/a/path/to/a/file.html'
e.substr(0, e.lastIndexOf("/"))

//result: '/this/is/a/path/to/a'

3
我认为您需要使用 path.dirname

2
filepath.split("/").slice(0,-1).join("/"); // get dir of filepath
  1. 将字符串按"/"分隔成数组
  2. 删除数组的最后一个元素(即文件名+扩展名)
  3. 使用"/"连接数组以生成目录路径

谢谢!这正是我需要将S3存储桶路径转换的东西! - jade290
p.split("/").slice(0, -2).join("/"); - 如果您的路径以“/”结尾 - Jonathan

1

-1
你可以只用__dirname来获取目录名。

1
这是当前文件的目录。当获取任何路径的值时,这将无法工作。 - Get Off My Lawn

-1

对于纯JavaScript,这将起作用:

function getDirName(e)
{
     if(e === null) return '/';

     if(e.indexOf("/") !== -1)
     {
         e = e.split('/')            //break the string into an array
         e.pop()                     //remove its last element
         e= e.join('/')              //join the array back into a string
         if(e === '')
              return '/';
         return e;
     }

     return "/";
}


var e = '/this/is/a/path/to/a/file.html'
var e = 'file.html'
var e = '/file.html'
getDirName(e)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接