Nodejs получить имя файла из абсолютного пути?

Если какой-либо API может получить имя файла из абсолютного пути к файлу?

например. "foo.txt" от "/var/www/foo.txt"

Я знаю, что он работает со строковой операцией, например fullpath.replace(/.+\//, '') но я хочу знать, есть ли более "формальный" способ, например file.getName() в java, может это сделать.

NodeJS получает имя файла из абсолютного пути?

Ответ 1

Используйте метод basename модуля path:

path.basename('/foo/bar/baz/asdf/quux.html')
// returns
'quux.html'

Вот документация, из которой взят пример выше.

Ответ 2

Чтобы получить часть имени файла с именем файла, используется метод 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'

Ответ 3

Если вы уже знаете, что разделителем пути является / (то есть вы пишете для конкретной платформы/среды), как следует из примера в вашем вопросе, вы можете оставить его простым и разбить строку на разделитель:

'/foo/bar/baz/asdf/quux.html'.split('/').pop()

Это было бы быстрее (и чище imo), чем замена регулярным выражением.

Опять же: Делайте это только если вы пишете для конкретной среды, в противном случае используйте модуль path, так как пути на удивление сложны. Windows, например, поддерживает / во многих случаях, но не для, например, \\?\? префиксы стилей, используемые для общих сетевых папок и тому подобное. В Windows описанный выше метод обречен на провал, рано или поздно.

Ответ 5

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

Ответ 6

Итак, 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();

Ответ 7

В NodeJS __filename.split(/\ |//). Pop() возвращает только имя файла из абсолютного пути к файлу на любой платформе ОС. Почему нужно заботиться о запоминании/импорте API, в то время как этот подход к регулярным выражениям также позволяет нам вспомнить наши навыки регулярных выражений.