151

I am using Node.js, and I want to obtain the parent directory name for a file. I have the file "../test1/folder1/FolderIWant/test.txt".

I want to get "FolderIWant".

I have tried:

var path = require('path');
var parentDir = path.dirname(filename);

But it returns ../test1/folder1/FolderIWant.

13 Answers 13

295

What you want is path.basename:

path.basename(path.dirname(filename))
Sign up to request clarification or add additional context in comments.

Comments

94

Daniel Wolf's answer is correct, also if you want the full path of the parent dir:

require('path').resolve(__dirname, '..')

Comments

87

Better use @danielwolf's answer instead


Use split() and pop():

path.dirname(filename).split(path.sep).pop()

Comments

4

process.mainModule property is deprecated in v14.0.0. If foo.js is run by node foo.js (e.g. somedir/foo.js"),

const path = require("path");

module.exports = path.dirname(require.main.filename);

result: somedir

Use require.main instead

Comments

4
const path = require("path")
path.dirname(path.basename(__dirname))

2 Comments

Backwards of stackoverflow.com/a/43779639/458321? this didn't work for me
This is incorrect
4

Whilst the answers herein worked somewhat, I found use of the popular app-root-path module a better anchor point from which to specify a path.

import { path as arp } from 'app-root-path'
import path from 'path'

const root = path.resolve(arp, '../') // the parent of the root path

export const rootDirname = root

Example usage as follows:

import { rootDirname } from './functions/src/utils/root-dirname'
import { getJsonFromFile } from './app/utils/get-json-from-file'

const firebaseJson = getJsonFromFile(`${rootDirname}/firebase.json`)

Maybe not the best answer here but an option not covered by other answers.

Comments

4

The typical __dirname solution doesn't work in an ESM scope. To move one level higher in the directory tree, I came up with the following solution:

import { fileURLToPath } from "url";
import path from "path";

const __filename = fileURLToPath(import.meta.url);
// First find out the __dirname, then resolve to one higher level in the dir tree
const __dirname = path.resolve(path.dirname(__filename), "../");

If you only need the absolute directory path the file resides in, you can leave out the path.resolve() call.

Comments

3

Using node as of 06-2019, I ran into an issue for accessing just filename. So instead, I just modified it a tiny bit and used:

path.dirname(__filename).split(path.sep).pop()

so now you get the directory name of the current directory you are in and not the full path. Although the previous answers seem to possibly work for others, for me it caused issues as node was looking for a const or a variable but couldn't find one.

Comments

2
const path = require('path');

module.exports = path.dirname(process.mainModule.filename)

Use this anywhere to get the root directory

2 Comments

it show error at mainModule. Unresolved variable mainModule
2

Simplest way without any node modules like the path. You can easily do in the following manner to get the root folder name.

var rootFolder = __dirname.split('/').pop();
console.log(rootFolder);

Comments

0

__dirname is an environment variable that tells you the absolute path of the directory containing the currently executing file.

Get just the parent with this simple code:

let parentFolder = __dirname.split('\\').pop();

output of my __dirname

console.log({ path: __dirname, parentDirectory: __dirname.split('\\').pop()});
{ 
path: 'C:\\Development\\Guides\\ParentFolder', 
parentDirectory: 'ParentFolder' 
}

Comments

0

Dynamically generates path to parent directory

import {dirname} from "path";
import {fileURLToPath} from "url";
const __dirname = dirname(fileURLToPath(import.meta.url));

Comments

0

If you're import, you can import basename:

import { dirname, basename } from 'node:path';
const parentName = dirname(basename(filename));

use the relative file path from the directory you are working in to access files along with __dirname Here's the documentation

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.