如何使用JavaScript从完整路径获取文件名?

时间:2009-01-08 05:43:32

标签: javascript

有没有办法可以从完整路径获取最后一个值(基于'\'符号)?

示例:

C:\Documents and Settings\img\recycled log.jpg

在这种情况下,我只想从JavaScript的完整路径中获取recycled log.jpg

20 个答案:

答案 0 :(得分:606)

var filename = fullPath.replace(/^.*[\\\/]/, '')

这将处理\ OR / in path

答案 1 :(得分:86)

为了表现,我测试了这里给出的所有答案:

var substringTest = function (str) {
    return str.substring(str.lastIndexOf('/')+1);
}

var replaceTest = function (str) {
    return str.replace(/^.*(\\|\/|\:)/, '');
}

var execTest = function (str) {
    return /([^\\]+)$/.exec(str)[1];
}

var splitTest = function (str) {
    return str.split('\\').pop().split('/').pop();
}

substringTest took   0.09508600000000023ms
replaceTest   took   0.049203000000000004ms
execTest      took   0.04859899999999939ms
splitTest     took   0.02505500000000005ms

获胜者是分裂和流行风格的答案,感谢 bobince

答案 2 :(得分:58)

路径来自哪个平台? Windows路径不同于POSIX路径不同于Mac OS 9路径不同于RISC OS路径不同......

如果它是一个Web应用程序,其中文件名可以来自不同的平台,则没有一个解决方案。然而,合理的尝试是使用'\'(Windows)和'/'(Linux / Unix / Mac以及Windows上的替代方案)作为路径分隔符。这是一个非RegExp版本,可以带来额外的乐趣:

var leafname= pathname.split('\\').pop().split('/').pop();

答案 3 :(得分:52)

在Node.js中,您可以使用Path's parse module ...

var path = require('path');
var file = '/home/user/dir/file.txt';

var filename = path.parse(file).base;
//=> 'file.txt'

答案 4 :(得分:27)

Ates,您的解决方案无法防止空字符串作为输入。在这种情况下,它失败了TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties

bobince,这是一个处理DOS,POSIX和HFS路径分隔符(和空字符串)的nickf版本:

return fullPath.replace(/^.*(\\|\/|\:)/, '');

答案 5 :(得分:16)

以下JavaScript代码行将为您提供文件名。

var z = location.pathname.substring(location.pathname.lastIndexOf('/')+1);
alert(z);

答案 6 :(得分:10)

不比nickf的answer更简洁,但是这个直接“提取”答案而不是用空字符串替换不需要的部分:

var filename = /([^\\]+)$/.exec(fullPath)[1];

答案 7 :(得分:8)

询问“获取没有扩展名的文件名”的问题请参考此处,但没有解决方法。 以下是Bobbie解决方案修改的解决方案。

var name_without_ext = (file_name.split('\\').pop().split('/').pop().split('.'))[0];

答案 8 :(得分:2)

不需要特别处理反斜杠;大多数答案不处理搜索参数。

现代方法是简单地使用 URL API 并获取 pathname 属性。 API 将反斜杠规范化为斜杠。

为了将结果 %20 解析为空格,只需将其传递给 decodeURIComponent

const getFileName = (fileName) => new URL(fileName).pathname.split("/").pop();

// URLs need to have the scheme portion, e.g. `file://` or `https://`.
console.log(getFileName("file://C:\\Documents and Settings\\img\\recycled log.jpg")); // "recycled%20log.jpg"
console.log(decodeURIComponent(getFileName("file://C:\\Documents and Settings\\img\\recycled log.jpg"))); // "recycled log.jpg"
console.log(getFileName("https://example.com:443/path/to/file.png?size=480")); // "file.png"
.as-console-wrapper { max-height: 100% !important; top: 0; }

如果您总是希望路径的最后一个非空部分(例如 .filter(Boolean) 来自 .pop() ).

如果您只有一个相对 URL 但仍然只想获取文件名,请使用 second argument of the URL constructor 传递基本来源。 file.png 就足够了:https://example.com/file.png/。也可以在您的 "https://example.com"new URL(fileName, "https://example.com") 构造函数接受 "https://" 作为有效 URL 之前添加 fileName

答案 9 :(得分:2)

我用:

var lastPart = path.replace(/\\$/,'').split('\\').pop();

它取代了最后一个\,因此它也适用于文件夹。

答案 10 :(得分:2)

<script type="text/javascript">
    function test()
    {
        var path = "C:/es/h221.txt";
        var pos =path.lastIndexOf( path.charAt( path.indexOf(":")+1) );
        alert("pos=" + pos );
        var filename = path.substring( pos+1);
        alert( filename );
    }
</script>
<form name="InputForm"
      action="page2.asp"
      method="post">
    <P><input type="button" name="b1" value="test file button"
    onClick="test()">
</form>

答案 11 :(得分:1)

完整的答案是:

<html>
    <head>
        <title>Testing File Upload Inputs</title>
        <script type="text/javascript">

        function replaceAll(txt, replace, with_this) {
            return txt.replace(new RegExp(replace, 'g'),with_this);
        }

        function showSrc() {
            document.getElementById("myframe").href = document.getElementById("myfile").value;
            var theexa = document.getElementById("myframe").href.replace("file:///","");
            var path = document.getElementById("myframe").href.replace("file:///","");
            var correctPath = replaceAll(path,"%20"," ");
            alert(correctPath);
        }
        </script>
    </head>
    <body>
        <form method="get" action="#"  >
            <input type="file"
                   id="myfile"
                   onChange="javascript:showSrc();"
                   size="30">
            <br>
            <a href="#" id="myframe"></a>
        </form>
    </body>
</html>

答案 12 :(得分:1)

项目中没有什么功能可从Windows的完整路径以及GNU / Linux和UNIX绝对路径确定文件名。

/**
 * @param {String} path Absolute path
 * @return {String} File name
 * @todo argument type checking during runtime
 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/includes
 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice
 * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/lastIndexOf
 * @example basename('/home/johndoe/github/my-package/webpack.config.js') // "webpack.config.js"
 * @example basename('C:\\Users\\johndoe\\github\\my-package\\webpack.config.js') // "webpack.config.js"
 */
function basename(path) {
  let separator = '/'

  const windowsSeparator = '\\'

  if (path.includes(windowsSeparator)) {
    separator = windowsSeparator
  }

  return path.slice(path.lastIndexOf(separator) + 1)
}

答案 13 :(得分:1)

另一个

var filename = fullPath.split(/[\\\/]/).pop();

split的正则表达式带有character class
这两个字符必须用'\'

进行转义

这个有一个array to split

var filename = fullPath.split(['/','\\']).pop();

如果需要,可以轻松将分隔符推入数组中!
如果您在程序中编写字符串,则需要escape the backslash
"C:\\Documents and Settings\\img\\recycled log.jpg"

答案 14 :(得分:0)

成功编写问题脚本,完整测试

<script src="~/Scripts/jquery-1.10.2.min.js"></script>

<p  title="text" id="FileNameShow" ></p>
<input type="file"
   id="myfile"
   onchange="javascript:showSrc();"
   size="30">


<script type="text/javascript">

function replaceAll(txt, replace, with_this) {
    return txt.replace(new RegExp(replace, 'g'), with_this);
}

function showSrc() {
    document.getElementById("myframe").href = document.getElementById("myfile").value;
    var theexa = document.getElementById("myframe").href.replace("file:///", "");
    var path = document.getElementById("myframe").href.replace("file:///", "");
    var correctPath = replaceAll(path, "%20", " ");
   alert(correctPath);
    var filename = correctPath.replace(/^.*[\\\/]/, '')
    $("#FileNameShow").text(filename)
}

答案 15 :(得分:0)

<html>
    <head>
        <title>Testing File Upload Inputs</title>
        <script type="text/javascript">
            <!--
            function showSrc() {
                document.getElementById("myframe").href = document.getElementById("myfile").value;
                var theexa = document.getElementById("myframe").href.replace("file:///","");
                alert(document.getElementById("myframe").href.replace("file:///",""));
            }
            // -->
        </script>
    </head>
    <body>
        <form method="get" action="#"  >
            <input type="file" 
                   id="myfile" 
                   onChange="javascript:showSrc();" 
                   size="30">
            <br>
            <a href="#" id="myframe"></a>
        </form>
    </body>
</html>

答案 16 :(得分:0)

对于“文件名”和“路径”,此解决方案都更加简单和通用。

const str = 'C:\\Documents and Settings\\img\\recycled log.jpg';

// regex to split path to two groups '(.*[\\\/])' for path and '(.*)' for file name
const regexPath = /^(.*[\\\/])(.*)$/;

// execute the match on the string str
const match = regexPath.exec(str);
if (match !== null) {
    // we ignore the match[0] because it's the match for the hole path string
    const filePath = match[1];
    const fileName = match[2];
}

答案 17 :(得分:-3)

var file_name = file_path.substring(file_path.lastIndexOf('/'));

答案 18 :(得分:-3)

function getFileName(path, isExtension){

  var fullFileName, fileNameWithoutExtension;

  // replace \ to /
  while( path.indexOf("\\") !== -1 ){
    path = path.replace("\\", "/");
  }

  fullFileName = path.split("/").pop();
  return (isExtension) ? fullFileName : fullFileName.slice( 0, fullFileName.lastIndexOf(".") );
}

答案 19 :(得分:-8)

<script type="text\javascript">   
   var path = '<%=Request.Url.GetLeftPart(UriPartial.Authority) + Request.ApplicationPath %>';
</script>

参考 http://www.codeprojectdownload.com