JavaScript를 사용하여 전체 경로에서 파일 이름을 얻는 방법은 무엇입니까?


310

전체 경로에서 마지막 값 ( '\'기호 기준)을 얻을 수있는 방법이 있습니까?

예:

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

이 경우 recycled log.jpgJavaScript의 전체 경로에서 벗어나고 싶습니다 .

답변:


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

경로에서 \ OR /를 모두 처리합니다.


4
크롬을 사용하는 MAC OSX에서는 작동하지 않습니다. \
Pankaj Phartiyal

7
이 사이트에 따르면, 사용은 replace이다 훨씬 보다 느린 substr와 함께 사용 할 수있는 lastIndexOf('/')+1: jsperf.com/replace-vs-substring
네이트

1
@nickf Nick, 내가 어디로 잘못 가고 있는지 확실하지 않지만 파일 경로에 단일 슬래시가 있으면 코드가 작동하지 않습니다. Fiddle대한 있지만 `\\ ' , 그것을 잘 작동합니다.
Shubh

1
난 그냥 내 콘솔이 실행, 그것은 슬래시에 대한 완벽한 일 : "/var/drop/foo/boo/moo.js".replace(/^.*[\\\/]/, '')리턴moo.js
vikkee

1
@ZloySmiertniy 좋은 온라인 정규 표현식 설명자가 있습니다. rick.measham.id.au/paste/explain.pl?regex=%2F%5E . * % 5B % 5C % 5C % 5C % 2F % 5D % 2F 및 regexper.com/#%2F%5E . * % 5B % 5C % 5C % 5C % 2F % 5D % 2F가 도움이 될 것입니다. (링크는 여기에서 끊어 지지만 탭에 복사하여 붙여 넣으면 작동합니다.)
nickf

115

성능을 위해 여기에 주어진 모든 대답을 테스트했습니다.

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 덕분에 Split and Pop 스타일 답변입니다 !


4
메타 토론에 따라 다른 답변에 적절한 인용을 추가하십시오. 런타임 분석 방법을 더 잘 설명하는 것도 도움이됩니다.
jpmc26

이 버전도 자유롭게 벤치마킹하십시오. Mac 및 Windows 파일 경로를 모두 지원해야합니다. path.split(/.*[\/|\\]/)[1];
tfmontague

2
테스트가 잘못되었습니다. substringTest는 슬래시 만 검색하고 execTest는 백 슬래시 만 검색하고 나머지 2 개는 슬래시를 처리합니다. 그리고 실제 결과는 더 이상 관련이 없습니다. 이 체크 아웃 : jsperf.com/name-from-path
슬픔에게

해당 링크가 더 이상 유효하지 않습니다.
paqogomez

88

Node.js에서 Path의 파싱 모듈을 사용할 수 있습니다 ...

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

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

14
Node.js를 사용하는 경우 다음 basename기능을 사용할 수 있습니다 .path.basename(file)
electrovir

66

경로는 어떤 플랫폼에서 제공됩니까? Windows 경로는 POSIX 경로와 다릅니다. Mac OS 9와 다릅니다. 경로는 RISC OS 경로와 다릅니다 ...

파일 이름이 다른 플랫폼에서 올 수있는 웹 응용 프로그램이라면 해결책이 없습니다. 그러나 합리적인 찌르기는 '\'(Windows) 및 '/'(Linux / Unix / Mac 및 Windows의 대안)을 경로 구분 기호로 사용하는 것입니다. 추가 재미를 위해 비 RegExp 버전이 있습니다.

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

고전적인 MacOS (<= 9)를 콜론 구분 기호 (:)로 추가하고 싶을 수도 있지만 MacOS 경로를 파일 형식으로 POSIX 경로로 변환하지 않은 브라우저는 아직 사용하고 있지 않습니다. : ///path/to/file.ext
눈꺼풀이 없음

4
reverse () [0] 대신 pop ()을 사용할 수 있습니다. 원래 배열도 수정하지만 귀하의 경우에는 괜찮습니다.
Chetan Sastry

경로를 얻기 위해 상대방을 어떻게 만들 수 있는지 궁금합니다.
Todd Horst

뭔가 같은 var path = '\\Dir2\\Sub1\\SubSub1'; //path = '/Dir2/Sub1/SubSub1'; path = path.split('\\').length > 1 ? path.split('\\').slice(0, -1).join('\\') : path; path = path.split('/').length > 1 ? path.split('/').slice(0, -1).join('/') : path; console.log(path);
토드 호르스트

" leaf name"이라는 이름은 디렉토리 / 파일 구조 이름 "Tree"에서 파생되며 tree의 첫 번째 는 root 이고 마지막은 leaves => file name은 트리 경로 에서 마지막 것입니다 => leaf :-)
jave. 웹

29

Ates에서는 솔루션이 빈 문자열을 입력으로 보호하지 않습니다. 이 경우에는로 실패합니다 TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties.

bobince, DOS, POSIX 및 HFS 경로 구분 기호 (및 빈 문자열)를 처리하는 nickf 버전이 있습니다.

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

4
우리가 PHP에서이 JS 코드를 작성하는 경우, 우리는 각 \에 대해 하나 개의 여분을 \ 추가 할 필요가
레닌 라즈 Rajasekaran

17

다음 JavaScript 코드 줄은 파일 이름을 제공합니다.

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

10

nickf의 대답 보다 간결 하지는 않지만 원치 않는 부분을 빈 문자열로 바꾸는 대신 대답을 직접 "추출"합니다.

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

8

"확장자없이 파일 이름을 가져 오십시오"라는 질문은 여기에 있지만 해결책은 없습니다. 다음은 Bobbie의 솔루션에서 수정 된 솔루션입니다.

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

6

다른 것

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

여기에 split문자 클래스 가있는 정규 표현식
이 있습니다. 두 문자는 '\'로 이스케이프해야합니다.

또는 배열을 사용 하여 분할

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

필요한 경우 더 많은 구분 기호를 배열로 동적으로 푸시하는 방법입니다.
경우 fullPath명시 적으로 코드에서 문자열로 설정이 필요 백 슬래시 탈출 !
처럼"C:\\Documents and Settings\\img\\recycled log.jpg"


3

나는 사용한다:

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

마지막을 대체 \하므로 폴더와도 작동합니다.


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>

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>

1

GNU / Linux 및 UNIX 절대 경로뿐만 아니라 Windows의 전체 경로에서 파일 이름을 결정하기 위해 프로젝트에 포함 할 기능이 거의 없습니다.

/**
 * @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)
}

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>

1
이 코드 스 니펫은 문제를 해결할 수 있지만 설명을 포함하면 게시물의 품질을 향상시키는 데 실제로 도움이됩니다. 앞으로 독자에게 질문에 대한 답변을 제공하고 있으며 해당 사람들이 코드 제안의 이유를 모를 수도 있습니다.
Ferrybig

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)
}


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

코드에 설명을 추가하여 답변의 품질을 향상시킬 수 있습니다. 이 답변을 검색하는 일부 사람들은 코딩이나 정규 표현식에 익숙하지 않을 수 있으며 컨텍스트를 제공하는 작은 텍스트는 이해를 돕기 위해 먼 길을 갈 것입니다.
jmarkmurphy

이 방법이 더 나은 희망 :)
Hicham

-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(".") );
}

-3

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.