112

In my File-system my working directory is here:

C:\temp\a\b\c\d

and under b\bb there's file: tmp.txt

C:\temp\a\b\bb\tmp.txt

If I want to go to this file from my working directory, I'll use this path:

"../../bb/tmp.txt"

In case the file is not exist I want to log the full path and tell the user:
"The file C:\temp\a\b\bb\tmp.txt is not exist".

My question:

I need some function that convert the relative path: "../../bb/tmp.txt" to absolute: "C:\temp\a\b\bb\tmp.txt"

In my code it should be like this:

console.log("The file" + convertToAbs("../../bb/tmp.txt") + " is not exist")
cheziHoyzer
  • 4,803
  • 12
  • 54
  • 81

4 Answers4

227

Use path.resolve

try:

resolve = require('path').resolve
resolve('../../bb/tmp.txt')
DarkKnight
  • 5,651
  • 2
  • 24
  • 36
15

You could also use __dirname and __filename for absolute path.

Tamir Abutbul
  • 7,301
  • 7
  • 25
  • 53
Vaibhav N Naik
  • 350
  • 1
  • 8
  • 8
    Use this only to know the absolute path of the current directory in which the file resides and the current file respectively. – kryptokinght Jan 05 '19 at 14:48
0

If you can't use require:

const path = {
    /**
    * @method resolveRelativeFromAbsolute resolves a relative path from an absolute path
    * @param {String} relitivePath relative path
    * @param {String} absolutePath absolute path
    * @param {String} split default?= '/', the path of the filePath to be split wth 
    * @param {RegExp} replace default?= /[\/|\\]/g, the regex or string to replace the filePath's splits with 
    * @returns {String} resolved absolutePath 
    */
    resolveRelativeFromAbsolute(relitivePath, absolutePath, split = '/', replace = /[\/|\\]/g) {
        relitivePath = relitivePath.replaceAll(replace, split).split(split);
        absolutePath = absolutePath.replaceAll(replace, split).split(split);
        const numberOfBacks = relitivePath.filter(file => file === '..').length;
        return [...absolutePath.slice(0, -(numberOfBacks + 1)), ...relitivePath.filter(file => file !== '..' && file !== '.')].join(split);
    }
};
const newPath = path.resolveRelativeFromAbsolute('C:/help/hi/hello/three', '../../two/one'); //returns 'C:/help/hi/two/one'
0

you can do it easily by adding this in your package.json:

"imports": {
    "#library/*": "./library/*"
}

and in each file you can import libraries with this syntax:

const db = require('#library/db.js');

your IDE will automatically detect the file and available functions in db.js module.

==================================

If you need to manage separate packages (with separate package.json for each of them) inside your directory your problem is a whole different thing:

you need to use workspaces for managing your packages inside your rep(monorepo) complete guide of the workspaces is in the official documentation:

https://docs.npmjs.com/cli/v7/using-npm/workspaces/