nodejs отримати ім'я файлу від абсолютного шляху?


289

Якщо якийсь API може отримати ім'я файлу з абсолютного шляху до файлу?

наприклад "foo.txt"від"/var/www/foo.txt"

Я знаю, що це працює за допомогою струнних операцій, як, fullpath.replace(/.+\//, '') але я хочу знати, чи існує більш "формальний" спосіб, як, наприклад, file.getName()у Java, який міг би зробити це.

NodeJS отримати ім'я файлу від абсолютного шляху?

Відповіді:


542

Використовуйте basenameметод pathмодуля:

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

Ось документація, з якої взято вищеприклад.


108
Якщо ви також хочете видалити розширення:path.basename(fpath, path.extname(fpath))
Waylon Flinn

33

Для отримання частини імені файлу імені файлу використовується метод базового імені:

var path = require("path");
var fileName = "C:\\Python27\\ArcGIS10.2\\python.exe";
var file = path.basename(fileName);

console.log(file); // 'python.exe'

Якщо ви хочете, щоб ім'я файлу без розширення, ви можете передати змінну розширення (що містить ім'я розширення) до методу базового імені, що дозволяє 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 вищевказаний метод рано чи пізно приречений на збій.


1
Windows має \ як роздільник папок
OwnageIsMagic

1
@OwnageIsMagic Так, тому я пишу "Якщо ви вже знаєте, що роздільник шляху є /" ... :)
leo

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 службі з будь-якого файлу, щоб пошук файлуName став динамічним

Нижче я використовую рядок 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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.