Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

NodeJS - convert relative path to absolute

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")
like image 341
cheziHoyzer Avatar asked Aug 08 '16 12:08

cheziHoyzer


People also ask

How do you convert relative path to absolute path?

The absolutePath function works by beginning at the starting folder and moving up one level for each "../" in the relative path. Then it concatenates the changed starting folder with the relative path to produce the equivalent absolute path.

How do you create an absolute path in node?

Use the path. resolve() method to get an absolute path of a file from a relative path in Node. js, e.g. path. resolve('./some-file.

What is __ Dirname in node?

__dirname: It is a local variable that returns the directory name of the current module. It returns the folder path of the current JavaScript file. Difference between process.cwd() vs __dirname in Node.js is as follows: process.cwd()


3 Answers

Use path.resolve

try:

resolve = require('path').resolve
resolve('../../bb/tmp.txt')
like image 134
DarkKnight Avatar answered Oct 21 '22 11:10

DarkKnight


You could also use __dirname and __filename for absolute path.

like image 33
Vaibhav N Naik Avatar answered Oct 21 '22 10:10

Vaibhav N Naik


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'
like image 1
mrpatches123 Avatar answered Oct 21 '22 10:10

mrpatches123