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

ファイル名のファイル名部分を取得するには、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の\はフォルダーセパレーターです
OwnageIsMagic

1
@OwnageIsMagicはい、それが私が「パスセパレーターが/であることをすでに知っている場合」と書く理由です... :)
leo

1
このステートメントの意味が明確ではありません。これにより、プラットフォームに依存するコードが生成され、他のプラットフォームでは
警告なしに

@OwnageIsMagicはい、確かにそうです。特定のプラットフォーム用に作成していない場合は、常にpathモ​​ジュールのメソッドを使用してください。
レオ

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()は、OSプラットフォーム上の絶対ファイルパスからファイル名のみを返します。この正規表現のアプローチで正規表現のスキルを思い出すことができるのに、なぜAPIを記憶/インポートする必要があるのか​​。


1
答えを詳しく説明してください。
透明性とモニカのJJ

0

Nodejsには、'__fileName'実行中の現在のファイルを保持するデフォルトのグローバル変数が付属しています。 私のアドバイスは、__ fileNameを任意のファイルからサービスに渡して、fileNameの取得が動的になるようにすることです

以下では、fileName文字列を使用し、それをに基づいて分割していpath.sepます。path.sepは、posixファイルセパレーターおよびWindowsファイルセパレーターの問題を回避します(「/」および「\」の問題)。それははるかにきれいです。部分文字列を取得し、最後の区切られた名前のみを取得し、それを実際の長さで3減算すると、それ自体がわかります。

あなたはこのようなサービスを書くことができます(これはtypescriptにありますが、それは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();
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.