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
asked May 4, 2009 at 2:10
GravitonGraviton
80.1k141 gold badges417 silver badges594 bronze badges
4
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];
Abyx
11.7k5 gold badges41 silver badges75 bronze badges
answered May 4, 2009 at 2:19
PhaedrusPhaedrus
8,29325 silver badges28 bronze badges
2
If you use Node.js
, path
module is quite handy.
path.dirname["/home/workspace/filename.txt"] // '/home/workspace/'
Zanon
26.8k20 gold badges109 silver badges122 bronze badges
answered Mar 21, 2020 at 12:34
W.PerrinW.Perrin
3,46929 silver badges28 bronze badges
2
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]
answered Aug 20, 2015 at 17:27
TheZverTheZver
1,4632 gold badges14 silver badges17 bronze badges
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];
Abyx
11.7k5 gold badges41 silver badges75 bronze badges
answered May 4, 2009 at 2:35
Matthew FlaschenMatthew Flaschen
271k49 gold badges510 silver badges537 bronze badges
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.
answered Nov 30, 2021 at 7:21
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'];
answered May 4, 2009 at 2:47
brianpeirisbrianpeiris
10.6k1 gold badge29 silver badges44 bronze badges
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.
answered Jan 22, 2016 at 21:18
SmujMaikuSmujMaiku
4464 silver badges10 bronze badges
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/'];
answered Mar 30, 2014 at 21:28
filepath.split["/"].slice[0,-1].join["/"]; // get dir of filepath
- split string into array delimited by "/"
- drop the last element of the array [which would be the file name + extension]
- join the array w/ "/" to generate the directory path
such that
"/path/to/test.js".split["/"].slice[0,-1].join["/"] == "/path/to"
answered May 20, 2018 at 16:45
Ulad KasachUlad Kasach
10.1k9 gold badges55 silver badges81 bronze badges
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];
Graviton
80.1k141 gold badges417 silver badges594 bronze badges
answered May 4, 2009 at 2:17
AshAsh
59.6k31 gold badges150 silver badges168 bronze badges
6