Reputation: 43768
Is there a way that I can get the last value (based on the '\' symbol) from a full path?
Example:
C:\Documents and Settings\img\recycled log.jpg
With this case, I just want to get recycled log.jpg
from the full path in JavaScript.
Upvotes: 447
Views: 625974
Reputation: 2196
In Node.js, to just get the basename, you can use the Path's modules basename
function:
var path = require('path');
var file = '/home/user/dir/file.txt';
var name = path.basename(file)
If you're doing more things with the file, you may want to use Path's parse
function:
var details = path.parse(file);
//=> { root: '/', dir: '/home/user/dir', base: 'file.txt', ext: '.txt', name: 'file' }
var name = details.base
//=> 'file.txt'
Upvotes: 190
Reputation: 545995
var filename = fullPath.replace(/^.*[\\/]/, '')
This will handle both / OR \ in paths.
Upvotes: 880
Reputation: 419
Replace is slower use substring
var fileName = fullPath.substring(fullPath.lastIndexOf('\\')+1);
Note: If you want to get from input field than you can directly get by the bellow simple code if any file is selected. Assume id="file"
var fileName = document.getElementById('file').files[0].name;
Upvotes: 0
Reputation: 19475
There’s no need to handle backslashes specially; most answers don’t handle search parameters.
The modern approach is to simply use the URL
API and get the pathname
property. The API normalizes backslashes to slashes. Note that location
(in a browser environment) works, too, but only for the current URL, not an arbitrary URL.
In order to parse the resulting %20
to a space, simply pass it to 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; }
Add a .filter(Boolean)
before the .pop()
if you always want the last non-empty part of the path (e.g. file.png
from https://example.com/file.png/
).
If you only have a relative URL but still simply want to get the file name, use the second argument of the URL
constructor to pass a base origin. "https://example.com"
suffices: new URL(fileName, "https://example.com")
. It’s also possible to prepend "https://"
to your fileName
— the URL
constructor accepts https://path/to/file.ext
as a valid URL.
Upvotes: 13
Reputation: 3651
In Node.js, you can use the path.basename
method
const path = require('path');
const file = '/home/user/dir/file.txt';
const filename = path.basename(file);
//=> 'file.txt'
Upvotes: 16
Reputation: 1101
A simple function like PHP pathInfo:
function pathInfo(s) {
s=s.match(/(.*?[\\/:])?(([^\\/:]*?)(\.[^\\/.]+?)?)(?:[?#].*)?$/);
return {path:s[1],file:s[2],name:s[3],ext:s[4]};
}
console.log( pathInfo('c:\\folder\\file.txt') );
console.log( pathInfo('/folder/another/file.min.js?query=1') );
Type and try it:
<input oninput="document.getElementById('test').textContent=pathInfo(this.value).file" value="c:\folder\folder.name\file.ext" style="width:300px">
Upvotes: 1
Reputation: 815
This solution is much simpler and generic, for both 'fileName' and 'path'.
parsePath = (path) => {
// regex to split path (untile last / or \ to two groups '(.*[\\\/])' for path and '(.*)' (untile the end after the \ or / )for file name
const regexPath = /^(?<path>(.*[\\\/])?)(?<filename>.*)$/;
const match = regexPath.exec(path);
if (path && match) {
return {
path: match.groups.path,
filename: match.groups.filename
}
}
throw Error("Error parsing path");
}
// example
const str = 'C:\\Documents and Settings\\img\\recycled log.jpg';
parsePath(str);
Upvotes: 4
Reputation:
Another one
var filename = fullPath.split(/[\\\/]/).pop();
Here split have a regular expression with a character class
The two characters have to be escaped with '\'
Or use array to split
var filename = fullPath.split(['/','\\']).pop();
It would be the way to dynamically push more separators into an array, if needed.
If fullPath
is explicitly set by a string in your code it need to escape the backslash!
Like "C:\\Documents and Settings\\img\\recycled log.jpg"
Upvotes: 15
Reputation: 2504
Little function to include in your project to determine the filename from a full path for Windows as well as GNU/Linux & UNIX absolute paths.
/**
* @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)
}
Upvotes: 3
Reputation: 23980
I use:
var lastPart = path.replace(/\\$/,'').split('\\').pop();
It replaces the last \
so it also works with folders.
Upvotes: 4
Reputation: 736
Successfully Script for your question ,Full Test
<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)
}
Upvotes: 0
Reputation: 19047
Just for the sake of performance, I tested all the answers given here:
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
And the winner is the Split and Pop style answer, Thanks to bobince !
Upvotes: 206
Reputation: 1467
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(".") );
}
Upvotes: -3
Reputation: 101
A question asking "get file name without extension" refer to here but no solution for that. Here is the solution modified from Bobbie's solution.
var name_without_ext = (file_name.split('\\').pop().split('/').pop().split('.'))[0];
Upvotes: 9
Reputation: 277
The following line of JavaScript code will give you the file name.
var z = location.pathname.substring(location.pathname.lastIndexOf('/')+1);
alert(z);
Upvotes: 26
Reputation: 19
The complete answer is:
<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>
Upvotes: 1
Reputation: 17
<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>
Upvotes: 0
Reputation:
<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>
Upvotes: 2
Reputation: 339
Ates, your solution doesn't protect against an empty string as input. In that case, it fails with TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties
.
bobince, here's a version of nickf's that handles DOS, POSIX, and HFS path delimiters (and empty strings):
return fullPath.replace(/^.*(\\|\/|\:)/, '');
Upvotes: 33
Reputation: 536339
What platform does the path come from? Windows paths are different from POSIX paths are different from Mac OS 9 paths are different from RISC OS paths are different...
If it's a web app where the filename can come from different platforms there is no one solution. However a reasonable stab is to use both '\' (Windows) and '/' (Linux/Unix/Mac and also an alternative on Windows) as path separators. Here's a non-RegExp version for extra fun:
var leafname= pathname.split('\\').pop().split('/').pop();
Upvotes: 94
Reputation: 140032
Not more concise than nickf's answer, but this one directly "extracts" the answer instead of replacing unwanted parts with an empty string:
var filename = /([^\\]+)$/.exec(fullPath)[1];
Upvotes: 10