Node.js API (path) - ファイルパスの文字列操作

Node.js では 標準モジュール の一つである Path モジュールでファイルパスの文字列の解析、操作などの機能が提供されています。 今回はその Path モジュールを使ったファイルパス関連の操作について紹介します。

Path モジュールは 'path' を require して使用します。
 var path = require('path');
なお、Path モジュールではファイルパスの文字列処理のみで、ファイル自体のコピー、移動といった処理は fs (File System)モジュールになります。

ファイルパスの解析

ファイルパスを元に各部分を取得する関数が用意されています。
関数 対象
dirname ディレクトリーパス
basename ディレクトリーのパスを取り除いたファイル名。
拡張子抜きの場合は、第 2 引数に拡張子を指定する
extname 拡張子
 var pathstr = '/foo/bar/baz/asdf/quux.html';
 path.dirname(pathstr);    // /foo/bar/baz/asdf
 path.extname(pathstr);    // .html
 path.basename(pathstr);   // quux.html
 path.basename(pathstr, path.extname(pathstr));    // quux
まとめてやる場合は parse でオブジェクトを取得します。
 path.parse(pathstr);
 // { root: '/',
 //   dir: '/foo/bar/baz/asdf',
 //   base: 'quux.html',
 //   ext: '.html',
 //   name: 'quux' }
Windows の場合、 root は 「ドライブ名 + ":\"」 になります。
 path.parse('c:\\foo\\bar\\baz\\asdf\\quux.html');
 // { root: 'c:\\',
 //   dir: 'c:\\foo\\bar\\baz\\asdf',
 //   base: 'quux.html',
 //   ext: '.html',
 //   name: 'quux' }
逆の生成は format です。 生成には dir と base の要素しか使いません。
 console.log(path.format({
     dir : "/path/dir",
     base : "file.txt"
 }));
 // /path/dir/file.txt

相対パス、絶対パス

相対パスを絶対パスに変換する場合 resolve を使います。
 path.resolve('../foo.txt'); // /home/user/foo.txt
逆に絶対パスを相対パスに変換する場合は relative を使います。
このとき、第 1 引数が基準となるディレクトリーです。
 path.relative('/data/orandea/test/aaa', '/data/orandea/impl/bbb'); // ../../impl/bbb
ファイルパスが絶対パスか相対パスかの判定は isAbsolute です。
 path.isAbsolute('/foo/bar'); // true
 path.isAbsolute('../bar');   // false
 path.isAbsolute('c:\\Program Files'); // true

その他のファイルパス操作

ディレクトリーパスとファイル名の結合など、ファイルパスの結合には join を使用します。
 path.join('/foo/bar/baz/asdf/', 'quux.html'); // /foo/bar/baz/asdf/quux.html
path.join('/foo/bar/baz/asdf',  'quux.html'); // /foo/bar/baz/asdf/quux.html
複数まとめて結合することもできます。
 path.join('/foo', 'bar', 'baz/asdf', 'quux', '..'); // /foo/bar/baz/asdf/quux.html
normalize はパス中の '..'、 '.' を解決します。
ちなみに文字列上の解決のみですので、ちゃんと絶対パスに直したい場合は resolve の方を使います。
 path.normalize('./foo/bar/baz/../quz/.'); // foo/bar/quz
 path.resolve(  './foo/bar/baz/../quz/.'); // /home/user/programmers_notes/foo/bar/quz

Windows, POSIX(Unix)

Windows と Unix ではパス区切りなどが違います。それらは path オブジェクトのメンバーに格納されています。
メンバー名 対象 Windows Unix
sep パス区切り \ /
delimiter 複数パスの区切り ; :
 '/foo/bar/baz'.split(path.sep); // [ '', 'foo', 'bar', 'baz' ]
 
 process.env.PATH;      // C:\Windows\system32;C:\Windows; ...
 process.env.PATH.split(path.delimiter);
 // [ 'C:\\Windows\\system32',
 //   'C:\\Windows',
 //     :
Windows と Unix では処理方法、結果などが変わってきます。
Window 上で Unix(POSIX) のパス処理をしたい場合などには posix, win32 を使います。
 path.posix.sep; // /
 path.win32.sep; // \
 path.posix.join('/foo/bar/baz/asdf/', 'quux.html'); // /foo/bar/baz/asdf/quux.html
 path.win32.join('/foo/bar/baz/asdf/', 'quux.html'); // \foo\bar\baz\asdf\quux.html
通常、 path の関数を呼び出した場合、その環境に合わせて posix または win32 の関数が呼び出されています。

サンプルコード

記事で使用したサンプルコードは以下のリンクから取得(名前をつけて保存)できます。 これを node コマンドの引数に渡して実行します。
$ node path.js 
node コマンドの使い方について詳しくは以前の記事をご覧ください。

関連記事
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
73位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
10位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

02月 | 2025年03月 | 04月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。