虹

node.jsで開発をしていると、ときたま現在のディレクトリの指定に関して悩むことがあったので、一度詳しく調べておこうと思いました。

node.jsには現在のディレクトリを指定するために2つの方法があります。

「__dirname」と「./(process.cwd())」です。

それぞれの違い

「./(process.cwd())」と「__dirname」の両方とも、カレントディレクトリを指定するという点では同じなのですが、どのディレクトリをカレントディレクトリとして実行するかが違います。

「__dirname」は常に何があろうと現在のファイルのディレクトリを指定します。

コードで両者の挙動の違いを確認

まずはparent,dirname,filesディレクトリを作成して、filesディレクトリ内にdirname.jsファイルを作成します。

$ mkdir -p parent/dirname/files
$ touch parent/dirname/files/dirname.js

dirname.js

var path = require('path');

console.log('__dirname:', __dirname);
console.log('process.cwd():', process.cwd());
console.log('./:', path.resolve('./'));

※現在のディレクトリ構造は以下の通りです。

parent
└── dirname
    └── files
        └── dirname.js

それでは、filesに移動し、カレントディレクトリがfiles/の状態でdirname.jsを実行してみましょう。

$ node dirname.js
__dirname: /~/parent/dirname/files
process.cwd(): /~/parent/dirname/files
./: /~/parent/dirname/files

すべて同じ挙動になりました。では、parentディレクトリからdirname.jsを実行したらどのような出力結果になるでしょうか。

__dirname: /~/parent/dirname/files
process.cwd(): /~/parent
./: /~/parent

「__dirname」がfilesディレクトリまでのパスを出力しているのに対して、「./(process.cwd())」はparentディレクトリまでのパスしか出力していません。

「__dirname」は常にファイルがあるディレクトリまでの絶対パスを返し、「./(process.cwd())」はnodeが実行されたディレクトリの実行パスを返すということが分かりましたね!

大体の場合はどちらを使っても問題はありませんが、require関数などを指定した場合に、少し異なる挙動をすることがあるため、「__dirname」を用いてファイルまでの絶対パスを指定して上げるほうが安心でしょう。

まとめ

・__dirname:常にjsが実行されるディレクトリの絶対パスを返します
・./(Process.cwd()):常に、nodeコマンドが実行されたディレクトリの絶対パスを返します

PROFILE

はじめまして、大阪のWeb制作会社Yuapです。「Yuap(ユアプ)」とは英語で「あなたのプランナー」という、Your Plannerの頭文字をとった社名です。 ホームページ制作|Webシステム開発|Webコンサルティングなどの業務を通じて、みなさまの事業の成長に貢献できるようなプランナーになれるよう、日々チャレンジしております。

※お問い合わせ・お見積りは無料です。 IT|ホームページ|Webシステムのことならなんでもお気軽にご相談ください。お問い合わせはこちらから。