Graviton
Graviton

Reputation: 83254

Get directory of a file name in Javascript

How to get the directory of a file?

For example, I pass in a string

C:\Program Files\nant\bin\nant.exe

I want a function that returns me

C:\Program Files\nant\bin

I would prefer a built in function that does the job, instead of having manually split the string and exclude the last one.

Edit: I am running on Windows

Upvotes: 46

Views: 73890

Answers (10)

Karishma Sukhwani
Karishma Sukhwani

Reputation: 645

Path module has an inbuilt function

Yes, the inbuilt module path has dirname() function, which would do the job for you.

const path = require("path");

file_path = "C:\\Program Files\\nant\\bin\\nant.exe" \\windows path
file_path = "C:/Program Files/nant/bin/nant.exe" \\linux path

path.dirname(file_path); \\gets you the folder path based on your OS

I see that your path is neither windows nor Linux compatible. Do not hardcode path; instead, take a reference from a path based on your OS.

I generally tackle such situations by creating relative paths using path.join(__dirname, "..", "assets", "banner.json");.

This gives me a relative path that works regardless of the OS you are using.

Upvotes: 7

W.Perrin
W.Perrin

Reputation: 4685

If you use Node.js, path module is quite handy.

path.dirname("/home/workspace/filename.txt") // '/home/workspace/'

Upvotes: 39

Ulad Kasach
Ulad Kasach

Reputation: 12808

filepath.split("/").slice(0,-1).join("/"); // get dir of filepath
  1. split string into array delimited by "/"
  2. drop the last element of the array (which would be the file name + extension)
  3. join the array w/ "/" to generate the directory path

such that

"/path/to/test.js".split("/").slice(0,-1).join("/") == "/path/to"

Upvotes: 2

SmujMaiku
SmujMaiku

Reputation: 643

Sorry to bring this back up but was also looking for a solution without referencing the variable twice. I came up with the following:

var filepath = 'C:\\Program Files\\nant\\bin\\nant.exe';
    // C:\Program Files\nant\bin\nant.exe
var dirpath = filepath.split('\\').reverse().splice(1).reverse().join('\\');
    // C:\Program Files\nant\bin

This is a bit of a walk through manipulating a string to array and back but it's clean enough I think.

Upvotes: 2

TheZver
TheZver

Reputation: 1582

Use:

var dirname = filename.match(/(.*)[\/\\]/)[1]||'';

*The answers that are based on lastIndexOf('/') or lastIndexOf('\') are error prone, because path can be "c:\aa/bb\cc/dd".
(Matthew Flaschen did took this into account, so my answer is a regex alternative)

Upvotes: 20

Matthew Flaschen
Matthew Flaschen

Reputation: 284786

There's no perfect solution, because this functionality isn't built-in, and there's no way to get the system file-separator. You can try:

path = path.substring(0, Math.max(path.lastIndexOf("/"), path.lastIndexOf("\\"))); 
alert(path);

Upvotes: 14

Phaedrus
Phaedrus

Reputation: 8421

I don't know if there is any built in functionality for this, but it's pretty straight forward to get the path.

path = path.substring(0,path.lastIndexOf("\\")+1);

Upvotes: 33

Paulo Mateus
Paulo Mateus

Reputation: 476

And this?

If isn't a program in addressFile, return addressFile

function(addressFile) {
    var pos = addressFile.lastIndexOf("/");
    pos = pos != -1 ? pos : addressFile.lastIndexOf("\\");

    if (pos > addressFile.lastIndexOf(".")) {
        return addressFile;
    }

    return addressFile.substring(
        0,
        pos+1
    );
}


console.assert(getFileDirectory('C:\\Program Files\\nant\\bin\\nant.exe') === 'C:\\Program Files\\nant\\bin\\');
console.assert(getFileDirectory('/usr/bin/nant') === '/usr/bin/nant/');
console.assert(getFileDirectory('/usr/thisfolderhaveadot.inhere') === '/usr/');

Upvotes: 1

Ash
Ash

Reputation: 62096

The core Javascript language doesn't provide file/io functions. However if you're working in a Windows OS you can use the FileSystemObject (ActiveX/COM).

Note: Don't use this in the client script-side script of a web application though, it's best in other areas such as in Windows script host, or the server side of a web app where you have more control over the platform.

This page provides a good tutorial on how to do this.

Here's a rough example to do what you want:

   var fso, targetFilePath,fileObj,folderObj;

   fso = new ActiveXObject("Scripting.FileSystemObject");

   fileObj = fso.GetFile(targetFilePath);

   folderObj=fileObj.ParentFolder;

   alert(folderObj.Path);

Upvotes: -4

brianpeiris
brianpeiris

Reputation: 10795

function getFileDirectory(filePath) {
  if (filePath.indexOf("/") == -1) { // windows
    return filePath.substring(0, filePath.lastIndexOf('\\'));
  } 
  else { // unix
    return filePath.substring(0, filePath.lastIndexOf('/'));
  }
}
console.assert(getFileDirectory('C:\\Program Files\\nant\\bin\\nant.exe') === 'C:\\Program Files\\nant\\bin');
console.assert(getFileDirectory('/usr/bin/nant') === '/usr/bin');

Upvotes: 3

Related Questions