Как получить имя файла по полному пути, используя JavaScript?
Есть ли способ, чтобы я мог получить последнее значение (на основе символа «\» ) из полного пути? Пример: C:\Documents and Settings\img\recycled log.jpg В этом случае я просто хочу получить recycled log.jpg из полного пути в JavaScript.
18 ответов
var filename = fullPath.replace(/^.*[\\\/]/, '')
Согласно этому сайту, использование replace намного медленнее, чем substr , который можно использовать вместе с lastIndexOf(‘/’)+1 : jsperf.com/replace-vs-substring
@nickf Ник, не уверен, где я ошибаюсь, но код не работает для меня, когда путь к файлу имеет одну косую черту. Fiddle , хотя для `\\` работает нормально.
@kooky A \ в строке JavaScript всегда создает символ экранирования, поэтому \n вставляет символ новой строки, и любой экранированный символ после его экранирования заменяется на символ. Следовательно, обратная косая черта в строке должна быть экранирована, если перед ней стоит другая обратная косая черта. Попробуйте это в этом JSFiddle . Вы должны были заметить , что выводимая строка не содержит какую — либо обратную косую черты.
Я просто хотел найти соответствующую часть в строке с регулярным выражением, как показывает Нейт, но ваше решение настолько блестящее, я должен сказать вам спасибо. Вы просто удаляете все части перед символами \ или / вместо того, чтобы расположить вас в строке. Спасибо за вашу идею, даже она медленнее, чем решение Нейта.
Я только что запустил это на своей консоли, и он отлично работал для «/var/drop/foo/boo/moo.js».replace(/^.*[\\\/]/, ») : «/var/drop/foo/boo/moo.js».replace(/^.*[\\\/]/, ») возвращает moo.js
@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 спасибо. Просто иногда выражение меняется в зависимости от языка. Regexper выглядит потрясающе! Рисование диаграммы выражения! : D
@ZloySmiertniy regex101.com также может быть полезен — вы можете указать, какой движок регулярных выражений вы используете.
Просто ради производительности я протестировал все ответы, приведенные здесь:
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
И победитель — это ответ стиля Split и Pop, благодаря bobince!
В мета-дискуссии, пожалуйста, добавьте соответствующую ссылку на другие ответы. Также было бы полезно лучше объяснить, как вы анализировали среду выполнения.
Не стесняйтесь тестировать и эту версию. Должен поддерживать пути к файлам Mac и Windows. path.split(/.*[\/|\\]/)[1];
Тест неверен. substringTest ищет только косую черту, execTest — только обратную косую черту, а два оставшихся обрабатывают обе косые черты. И реальные результаты не имеют значения (больше). Проверьте это: jsperf.com/name-from-path
На какой платформе появился путь? Пути Windows отличаются от путей POSIX, отличных от путей Mac OS 9, отличаются от путей RISC OS, разные.
Если это веб-приложение, где имя файла может поступать с разных платформ, нет ни одного решения. Однако разумный удар — использовать как «\» (Windows), так и «/» (Linux/Unix/Mac, а также альтернативу в Windows) в качестве разделителей путей. Здесь версия, отличная от RegExp, для дополнительного удовольствия:
var leafname= pathname.split('\\').pop().split('/').pop();
Возможно, вы захотите добавить, что классический MacOS (
Вы можете просто использовать pop () вместо reverse () [0]. Он также изменяет исходный массив, но в вашем случае это нормально.
Что-то вроде 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);
Наименование «имя листа » происходит от имени структуры каталогов / файлов «Дерево», первым элементом дерева является root , последними являются листья => имя файла является последним в пути к дереву => leaf 🙂
В Node.js вы можете использовать модуль анализа пути.
var path = require('path'); var file = '/home/user/dir/file.txt'; var filename = path.parse(file).base; //=> 'file.txt'
Ates, ваше решение не защищает от пустой строки в качестве входных данных. В этом случае он терпит неудачу с TypeError: /([^(\\|\/|\:)]+)$/.exec(fullPath) has no properties .
bobince, здесь версия nickf, которая обрабатывает разделители DOS, POSIX и HFS (и пустые строки):
Следующая строка кода JavaScript даст вам имя файла.
var z = location.pathname.substring(location.pathname.lastIndexOf('/')+1); alert(z);
Не более кратким, чем nickf answer, но этот непосредственно «извлекает» ответ вместо замены нежелательных частей пустой строкой:
var filename = /([^\\]+)$/.exec(fullPath)[1];
Вопрос, задающий вопрос «получить имя файла без расширения», приведен здесь, но для этого нет решения. Вот решение, модифицированное из решения Bobbie.
var name_without_ext = (file_name.split('\\').pop().split('/').pop().split('.'))[0];
var lastPart = path.replace(/\\$/,'').split('\\').pop();
Он заменяет последний \ , поэтому он также работает с папками.
Маленькая функция для включения в ваш проект для определения имени файла по полному пути для Windows, а также по абсолютным путям GNU/Linux и UNIX.
/** * @param path Absolute path * @return 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) >
File.name
Возвращает имя файла представленного объектом типа File . По соображениям безопасности не содержит пути к файлу.
Синтаксис
Значение
Строка, содержащая имя файла без пути, например, «My Resume.rtf».
Пример
input type="file" multiple onchange="processSelectedFiles(this)">
function processSelectedFiles(fileInput) var files = fileInput.files; for (var i = 0; i files.length; i++) alert("Filename " + files[i].name); > >
Проверьте результаты ниже:
Спецификация
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Found a content problem with this page?
This page was last modified on 7 нояб. 2022 г. by MDN contributors.
Your blueprint for a better internet.
MDN
Support
Our communities
Developers
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998– 2023 by individual mozilla.org contributors. Content available under a Creative Commons license.