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

289

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

например, "foo.txt"из"/var/www/foo.txt"

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

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

FXP
источник

Ответы:

542

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

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

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

Виктор Станчу
источник
108
Если вы также хотите удалить расширение:path.basename(fpath, path.extname(fpath))
Waylon
33

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

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

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

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

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

Лео
источник
1
Windows имеет \ as разделитель папок
OwnageIsMagic
1
@OwnageIsMagic Да, именно поэтому я пишу «Если вы уже знаете, что разделитель пути является /» ... :)
Лев
1
Непонятно, что вы имели в виду под этим утверждением. В результате получается зависимый от платформы код, который на других платформах будет автоматически завершаться сбоем
OwnageIsMagic
@OwnageIsMagic Да, это действительно так. Всегда используйте методы модуля пути, если вы не пишете для конкретной платформы.
Лев
Windows фактически принимает и / и \ в качестве разделителей папок, и вы можете даже смешать их
RozzA
3
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);
Кевин Мухват
источник
0

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

Висв М
источник
1
Пожалуйста, опишите ваш ответ.
JJ для Прозрачности и Моники
0

Итак, 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;
     return appName+ ' -- '+actualFileName;
    }


}

export const AppLoggingConstantsInstance = new AppLoggingConstants();
Joey587
источник