Come ottenere il nome del file da un percorso completo utilizzando JavaScript?


310

C'è un modo in cui posso ottenere l'ultimo valore (basato sul simbolo '\') da un percorso completo?

Esempio:

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

In questo caso, voglio solo ottenere recycled log.jpgdal percorso completo in JavaScript.

Risposte:


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

Questo gestirà entrambi i percorsi \ OR / in


4
Non funziona su MAC OSX, usando Chrome, sfugge al carattere dopo \
Pankaj Phartiyal

7
Secondo questo sito, l'utilizzo replaceè molto più lento di substr, che può essere utilizzato insieme a lastIndexOf('/')+1: jsperf.com/replace-vs-substring
Nate

1
@nickf Nick, non sono sicuro di dove vada storto, ma il codice non funziona per me quando il percorso del file ha una singola barra. Fiddle, sebbene per `\\` , funzioni bene.
Shubh,

1
Ho appena eseguito questo sulla mia console, e ha funzionato perfettamente per le barre in avanti: "/var/drop/foo/boo/moo.js".replace(/^.*[\\\/]/, '')restituiscemoo.js
vikkee il

1
@ZloySmiertniy Ci sono un paio di buoni spiegatori di regex online. rick.measham.id.au/paste/explain.pl?regex=%2F%5E . *% 5B% 5C% 5C% 5C% 2F% 5D% 2F e regexper.com/#%2F%5E . *% 5B % 5C% 5C% 5C% 2F% 5D% 2F dovrebbe aiutare. (I collegamenti sono interrotti qui, ma copia-incolla in una scheda e funzionerà)
nickf

115

Solo per motivi di prestazioni, ho testato tutte le risposte fornite qui:

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

E il vincitore è la risposta in stile Split e Pop , grazie a bobince !


4
Per la meta discussione, si prega di aggiungere una citazione appropriata ad altre risposte. Sarebbe anche utile spiegare meglio come hai analizzato il runtime.
jpmc26,

Sentiti libero di confrontare anche questa versione. Dovrebbe supportare sia i percorsi dei file Mac che Windows. path.split(/.*[\/|\\]/)[1];
tfmontague,

2
Il test non è corretto substringTest cerca solo barra, execTest - solo barra rovesciata mentre due rimanenti gestiscono entrambe le barre. E i risultati effettivi non sono rilevanti (più). Dai
Grief

@Grief che il link non è più valido.
paqogomez,

88

In Node.js è possibile utilizzare il modulo di analisi Path ...

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

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

14
Se usi Node.js puoi semplicemente usare la basenamefunzione:path.basename(file)
electrovir l'

66

Da quale piattaforma proviene il percorso? I percorsi di Windows sono diversi dai percorsi POSIX sono diversi da quelli di Mac OS 9 sono diversi dai percorsi del sistema operativo RISC sono diversi ...

Se si tratta di un'app Web in cui il nome file può provenire da piattaforme diverse, non esiste una soluzione. Tuttavia, una pugnalata ragionevole è usare sia '\' (Windows) che '/' (Linux / Unix / Mac e anche un'alternativa su Windows) come separatori di percorsi. Ecco una versione non RegExp per un divertimento extra:

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

Potresti voler aggiungere che MacOS classico (<= 9) utilizzava i separatori di due punti (:), ma non sono a conoscenza di eventuali browser che potrebbero essere ancora in uso che non traducono i percorsi di MacOS in percorsi POSIX sotto forma di file : ///path/to/file.ext
eyelidlessness

4
Puoi semplicemente usare pop () invece di reverse () [0]. Modifica anche l'array originale ma va bene nel tuo caso.
Chetan Sastry,

Mi chiedo come possiamo creare una controparte per ottenere solo il percorso.
Todd Horst,

Qualcosa del genere 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);
Todd Horst,

La denominazione di " nome foglia " deriva dal nome della struttura di directory / file "Albero", la prima cosa dell'albero è radice , le ultime sono le foglie => il nome del file è l'ultima cosa nel percorso dell'albero => foglia :-)
jave. web

29

Tuttavia, la tua soluzione non protegge da una stringa vuota come input. In tal caso, non riesceTypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties .

bobince, ecco una versione di nickf che gestisce i delimitatori di percorso DOS, POSIX e HFS (e stringhe vuote):

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

4
se stiamo scrivendo questo codice JS in PHP, dobbiamo aggiungere un \ extra per ciascuno \
Lenin Raj Rajasekaran,

17

La seguente riga di codice JavaScript ti darà il nome del file.

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

10

Non più conciso della risposta di Nickf , ma questo "estrae" direttamente la risposta invece di sostituire le parti indesiderate con una stringa vuota:

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

8

Una domanda che chiede "ottieni il nome del file senza estensione" si riferisce qui, ma nessuna soluzione per questo. Ecco la soluzione modificata dalla soluzione di Bobbie.

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

6

Un altro

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

Qui split ha un'espressione regolare con una classe di caratteri
I due personaggi devono essere sfuggiti con '\'

Oppure usa l' array per dividere

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

Sarebbe il modo di spingere dinamicamente più separatori in un array, se necessario.
Se fullPathè esplicitamente impostato da una stringa nel tuo codice, è necessario evitare la barra rovesciata !
Piace"C:\\Documents and Settings\\img\\recycled log.jpg"


3

Io uso:

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

Sostituisce l'ultimo, \quindi funziona anche con le cartelle.


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

La risposta completa è:

<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

Poca funzione da includere nel progetto per determinare il nome file da un percorso completo per Windows, nonché percorsi assoluti GNU / Linux e 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)
}

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
Sebbene questo frammento di codice possa risolvere la domanda, inclusa una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice.
Ferrybig,

0

Script riuscito per la tua domanda, Test completo

<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

Questa soluzione è molto più semplice e generica, sia per "nome file" che per "percorso".

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

La qualità di una risposta può essere migliorata aggiungendo alcune spiegazioni al tuo codice. Alcune persone alla ricerca di questa risposta potrebbero essere nuove nella programmazione o espressioni regolari, e un po 'di testo per dare un contesto farà molto per aiutare a capire.
jmarkmurphy,

spero che sia meglio :)
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('/'));

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.