Ответ 1
Используйте метод basename
модуля path
:
path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'
Вот документация, из которой взят пример выше.
Если какой-либо API может получить имя файла из абсолютного пути к файлу?
например. "foo.txt"
от "/var/www/foo.txt"
Я знаю, что он работает со строковой операцией, например fullpath.replace(/.+\//, '')
но я хочу знать, есть ли более "формальный" способ, например file.getName()
в java, может это сделать.
NodeJS получает имя файла из абсолютного пути?
Используйте метод basename
модуля path
:
path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'
Вот документация, из которой взят пример выше.
Чтобы получить часть имени файла с именем файла, используется метод basename:
var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var file = path.basename(fileName);
console.log(file); // 'python.exe'
Если вам нужно имя файла без расширения, вы можете передать переменную расширения (содержащую имя расширения) методу basename, сообщив Node, что нужно возвращать только имя без расширения:
var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var extension = path.extname(fileName);
var file = path.basename(fileName,extension);
console.log(file); // 'python'
Если вы уже знаете, что разделителем пути является /
(то есть вы пишете для конкретной платформы/среды), как следует из примера в вашем вопросе, вы можете оставить его простым и разбить строку на разделитель:
'/foo/bar/baz/asdf/quux.html'.split('/').pop()
Это было бы быстрее (и чище imo), чем замена регулярным выражением.
Опять же: Делайте это только если вы пишете для конкретной среды, в противном случае используйте модуль path
, так как пути на удивление сложны. Windows, например, поддерживает /
во многих случаях, но не для, например, \\?\?
префиксы стилей, используемые для общих сетевых папок и тому подобное. В Windows описанный выше метод обречен на провал, рано или поздно.
Для тех, кто заинтересован в удалении расширения из имени файла, вы можете использовать https://nodejs.org/api/path.html#path_path_basename_path_ext
path.basename('/foo/bar/baz/asdf/quux.html', '.html');
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.parse(filepath).name;
Дает вам имя файла без расширения, если вы используете имя с расширением
var path = require("path");
var filepath = "C:\\Python27\\ArcGIS10.2\\python.exe";
var name = path.basename(filepath);
Итак, Nodejs поставляется с глобальной переменной по умолчанию, называемой '__fileName'
которая содержит текущий исполняемый файл. Мой совет - передать __fileName службе из любого файла, чтобы извлечение fileName делалось динамическим.
Ниже я использую строку fileName, а затем разделяю ее на основе path.sep
. Обратите внимание, что path.sep позволяет избежать проблем с файловыми разделителями posix и файловыми разделителями windows (проблемы с '/' и '\'). Это намного чище. Получение подстроки и получение только последнего разделенного имени и вычитание его с длиной актуали на 3 говорит само за себя.
Вы можете написать такой сервис (обратите внимание, что это машинопись, но вы можете написать его в js)
export class AppLoggingConstants {
constructor(){
}
// Here make sure the fileName param is actually '__fileName'
getDefaultMedata(fileName: string, methodName: string) {
const appName = APP_NAME;
const actualFileName = fileName.substring(fileName.lastIndexOf(path.sep)+1, fileName.length - 3);
//const actualFileName = fileName;
const timeStamp = momentTimeZone().tz(TIMEZONE).format(TIMEZONE_FORMAT);
return 'AppName - ${appName} -- fileName: ${actualFileName} --
method: ${methodName} -- timeStamp: ${timeStamp}';
}
}
export const AppLoggingConstantsInstance = new AppLoggingConstants();
В NodeJS __filename.split(/\ |//). Pop() возвращает только имя файла из абсолютного пути к файлу на любой платформе ОС. Почему нужно заботиться о запоминании/импорте API, в то время как этот подход к регулярным выражениям также позволяет нам вспомнить наши навыки регулярных выражений.