# The gist
In Node.js, `__dirname` is always the directory in which the currently executing script resides ([see this][1]). So if you typed `__dirname` into `/d1/d2/myscript.js`, the value would be `/d1/d2`.
By contrast, `.` gives you the directory from which you ran the `node` command in your terminal window (i.e. your working directory) when you use libraries like `path` and `fs`. Technically, it starts out as your working directory but can be changed using `process.chdir()`.
The exception is when you use `.` with `require()`. The path inside `require` is always relative to the file containing the call to `require`.
# For example...
Let's say your directory structure is
/dir1
/dir2
pathtest.js
and `pathtest.js` contains
var path = require("path");
console.log(". = %s", path.resolve("."));
console.log("__dirname = %s", path.resolve(__dirname));
and you do
cd /dir1/dir2
node pathtest.js
you get
. = /dir1/dir2
__dirname = /dir1/dir2
Your working directory is `/dir1/dir2` so that's what `.` resolves to. Since `pathtest.js` is located in `/dir1/dir2` that's what `__dirname` resolves to as well.
However, if you run the script from `/dir1`
cd /dir1
node dir2/pathtest.js
you get
. = /dir1
__dirname = /dir1/dir2
In that case, your working directory was `/dir1` so that's what `.` resolved to, but `__dirname` still resolves to `/dir1/dir2`.
### Using `.` inside `require`...
If inside `dir2/pathtest.js` you have a `require` call into include a file inside `dir1` you would **always** do
require('../thefile')
because the path inside `require` is always relative to the file in which you are calling it. It has nothing to do with your working directory.
[1]:
[To see links please register here]