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.htmlnormalize はパス中の '..'、 '.' を解決します。
ちなみに文字列上の解決のみですので、ちゃんと絶対パスに直したい場合は 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.jsnode コマンドの使い方について詳しくは以前の記事をご覧ください。
- 関連記事
-
- Node.js API (events) - イベントシステム
- Node.js API (process) - exit によるプログラムの終了
- Node.js API (process) - シグナルイベント
- Node.js API (url) - URL 文字列の解析と生成
- Node.js API (path) - ファイルパスの文字列操作
Facebook コメント
コメント