Get the application's path
Asked Answered
L

21

80

I've recently searched how I could get the application's directory in Java. I've finally found the answer but I've needed surprisingly long because searching for such a generic term isn't easy. I think it would be a good idea to compile a list of how to achieve this in multiple languages.

Feel free to up/downvote if you (don't) like the idea and please contribute if you like it.

Clarification:

There's a fine distinction between the directory that contains the executable file and the current working directory (given by pwd under Unix). I was originally interested in the former but feel free to post methods for determining the latter as well (clarifying which one you mean).

Laceylach answered 20/10, 2008 at 11:7 Comment(1)
What path do you mean? The current working directory, or the directory in which the executable code resides?Acre
E
58

In Java the calls

System.getProperty("user.dir")

and

new java.io.File(".").getAbsolutePath();

return the current working directory.

The call to

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

returns the path to the JAR file containing the current class, or the CLASSPATH element (path) that yielded the current class if you're running directly from the filesystem.

Example:

  1. Your application is located at

     C:\MyJar.jar
    
  2. Open the shell (cmd.exe) and cd to C:\test\subdirectory.

  3. Start the application using the command java -jar C:\MyJar.jar.

  4. The first two calls return 'C:\test\subdirectory'; the third call returns 'C:\MyJar.jar'.

When running from a filesystem rather than a JAR file, the result will be the path to the root of the generated class files, for instance

c:\eclipse\workspaces\YourProject\bin\

The path does not include the package directories for the generated class files.

A complete example to get the application directory without .jar file name, or the corresponding path to the class files if running directly from the filesystem (e.g. when debugging):

String applicationDir = getClass().getProtectionDomain().getCodeSource().getLocation().getPath(); 

if (applicationDir.endsWith(".jar"))
{
    applicationDir = new File(applicationDir).getParent();
}
// else we already have the correct answer
Elizabetelizabeth answered 20/10, 2008 at 11:7 Comment(2)
Was looking for a way to put read-only files into the same package as the java classes... getClass().getProtectionDomain().getCodeSource().getLocation().getPath() worked perfectly, thanks!Goldeye
@fuzzyanalysis That's exactly what Class.getResource() is for.Biographical
L
22

In .NET (C#, VB, …), you can query the current Assembly instance for its Location. However, this has the executable's file name appended. The following code sanitizes the path (using System.IO and using System.Reflection):

Directory.GetParent(Assembly.GetExecutingAssembly().Location)

Alternatively, you can use the information provided by AppDomain to search for referenced assemblies:

System.AppDomain.CurrentDomain.BaseDirectory

VB allows another shortcut via the My namespace:

My.Application.Info.DirectoryPath
Laceylach answered 20/10, 2008 at 11:7 Comment(2)
You can also use Application.StartupPath for some programs. It won't work for ASP.NET, though.Estreat
Actually its, Application.ExecutablePathHardened
S
9

In Windows, use the WinAPI function GetModuleFileName(). Pass in NULL for the module handle to get the path for the current module.

Shererd answered 20/10, 2008 at 11:7 Comment(0)
M
7

Python

path = os.path.dirname(__file__)

That gets the path of the current module.

Masqat answered 20/10, 2008 at 11:7 Comment(0)
E
5

Objective-C Cocoa (Mac OS X, I don't know for iPhone specificities):

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];
Electrical answered 20/10, 2008 at 11:7 Comment(1)
In my Mac OSX app, I was looking for the actual path to the executable file (for inclusion in a plist) and used this: NSString *executablePath = [[NSBundle mainBundle] executablePath]; - there's also an 'executableURL' version to return an URL instead of a stringCrater
H
4

In VB6, you can get the application path using the App.Path property.

Note that this will not have a trailing \ EXCEPT when the application is in the root of the drive.

In the IDE:

?App.Path
C:\Program Files\Microsoft Visual Studio\VB98
Higbee answered 20/10, 2008 at 11:7 Comment(0)
D
4

In .Net you can use

System.IO.Directory.GetCurrentDirectory

to get the current working directory of the application, and in VB.NET specifically you can use

My.Application.Info.DirectoryPath

to get the directory of the exe.

Declassify answered 20/10, 2008 at 11:7 Comment(0)
L
4

In Java, there are two ways to find the application's path. One is to employ System.getProperty:

System.getProperty("user.dir");

Another possibility is the use of java.io.File:

new java.io.File("").getAbsolutePath();

Yet another possibilty uses reflection:

getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
Laceylach answered 20/10, 2008 at 11:7 Comment(5)
Note that this is a bit misleading/confusing. The three methods you quote can give completely different results!Disenthrall
Zarkonnen: You're right but as implied in my original posting, I'm no expert. This is a community wiki. Please feel free to edit/correct my answer!Laceylach
TIP: Usually the path doesn't need to be specified if you want to access a file in the current working directory, like: file = new File("file.cfg"); Just be sure to always set the working directory to the location of your application during initialization or at the application shortcut.Egesta
@Egesta Don’t set the working directory at launch, this has some undesired consequences, such as pointing some file chooser dialogs by default to the application’s path, rather than the user-chosen working directory.Laceylach
Two major problems with the last approach: One, ProtectionDomain.getCodeSource() can return null. Two, URL.getPath() does not return a file name, it just returns a (possibly escaped) path portion of a URL. C:\Program Files\ExampleApp is represented in URL form as file:/C:/Program%20Files/ExampleApp, for which getPath() returns "/C:/Program%20Files/ExampleApp", which obviously doesn’t exist. The only correct way to convert a URL to a file is new File(url.toURI()).Mutant
P
3

Libc
In *nix type environment (also Cygwin in Windows):

  #include <unistd.h>

   char *getcwd(char *buf, size_t size);

   char *getwd(char *buf); //deprecated

   char *get_current_dir_name(void);

See man page

Prince answered 20/10, 2008 at 11:7 Comment(0)
V
3

Delphi

In Windows applications:

Unit Forms;
path := ExtractFilePath(Application.ExeName);

In console applications:

Independent of language, the first command line parameter is the fully qualified executable name:

Unit System;
path := ExtractFilePath(ParamStr(0));
Venn answered 20/10, 2008 at 11:7 Comment(0)
I
2

Java:

On all systems (Windows, Linux, Mac OS X) works for me only this:

public static File getApplicationDir() 
{
    URL url = ClassLoader.getSystemClassLoader().getResource(".");
    File applicationDir = null;
    try {
        applicationDir = new File(url.toURI());
    } catch(URISyntaxException e) {
        applicationDir = new File(url.getPath());
    }

    return applicationDir;
}
Incumbent answered 20/10, 2008 at 11:7 Comment(1)
This throws NPE if the application is running in a JAR file.Biographical
H
2

in Android its

getApplicationInfo().dataDir;

to get SD card, I use

Environment.getExternalStorageDirectory();
Environment.getExternalStoragePublicDirectory(String type);

where the latter is used to store a specific type of file (Audio / Movies etc). You have constants for these strings in Environment class.

Basically, for anything to with app use ApplicationInfo class and for anything to do with data in SD card / External Directory using Environment class.

Docs : ApplicationInfo , Environment

Haemophilic answered 20/10, 2008 at 11:7 Comment(0)
E
2

In PHP :

<?php
  echo __DIR__; //same as dirname(__FILE__). will return the directory of the running script
  echo $_SERVER["DOCUMENT_ROOT"]; // will return the document root directory under which the current script is executing, as defined in the server's configuration file.
  echo getcwd(); //will return the current working directory (it may differ from the current script location).
?>
Egesta answered 20/10, 2008 at 11:7 Comment(0)
A
2

In Tcl

Path of current script:

set path [info script]

Tcl shell path:

set path [info nameofexecutable]

If you need the directory of any of these, do:

set dir [file dirname $path]

Get current (working) directory:

set dir [pwd]
Annabel answered 20/10, 2008 at 11:7 Comment(0)
A
2

Unix

In unix one can find the path to the executable that was started using the environment variables. It is not necessarily an absolute path, so you would need to combine the current working directory (in the shell: pwd) and/or PATH variable with the value of the 0'th element of the environment.

The value is limited in unix though, as the executable can for example be called through a symbolic link, and only the initial link is used for the environment variable. In general applications on unix are not very robust if they use this for any interesting thing (such as loading resources). On unix, it is common to use hard-coded locations for things, for example a configuration file in /etc where the resource locations are specified.

Acre answered 20/10, 2008 at 11:7 Comment(0)
C
2

In bash, the 'pwd' command returns the current working directory.

Ceroplastics answered 20/10, 2008 at 11:7 Comment(2)
Unfortunately, pwd returns the current working directory which may differ from the path of the script.Laceylach
The answer is actually found in #60395Laceylach
L
1

I released https://github.com/gpakosz/whereami which solves the problem in C and gives you:

  • the path to the current executable
  • the path to the current module (differs from path to executable when calling from a shared library).

It uses GetModuleFileNameW on Windows, parses /proc/self/maps on Linux and Android and uses _NSGetExecutablePath or dladdr on Mac and iOS.

Lith answered 20/10, 2008 at 11:7 Comment(0)
A
1

In cmd (the Microsoft command line shell)

You can get the name of the script with %* (may be relative to pwd)

This gets directory of script:

set oldpwd=%cd%
cd %0\..
set app_dir=%pwd%
cd %oldpwd%

If you find any bugs, which you will. Then please fix or comment.

Appurtenant answered 20/10, 2008 at 11:7 Comment(0)
J
1

In CFML there are two functions for accessing the path of a script:

getBaseTemplatePath()
getCurrentTemplatePath()

Calling getBaseTemplatePath returns the path of the 'base' script - i.e. the one that was requested by the web server.
Calling getCurrentTemplatePath returns the path of the current script - i.e. the one that is currently executing.

Both paths are absolute and contain the full directory+filename of the script.

To determine just the directory, use the function getDirectoryFromPath( ... ) on the results.

So, to determine the directory location of an application, you could do:

<cfset Application.Paths.Root = getDirectoryFromPath( getCurrentTemplatePath() ) />

Inside of the onApplicationStart event for your Application.cfc



To determine the path where the app server running your CFML engine is at, you can access shell commands with cfexecute, so (bearing in mind above discussions on pwd/etc) you can do:

Unix:

<cfexecute name="pwd"/>

for Windows, create a pwd.bat containing text @cd, then:

<cfexecute name="C:\docume~1\myuser\pwd.bat"/>

(Use the variable attribute of cfexecute to store the value instead of outputting to screen.)

Jura answered 20/10, 2008 at 11:7 Comment(0)
B
1

in Ruby, the following snippet returns the path of the current source file:

path = File.dirname(__FILE__)
Boarer answered 20/10, 2008 at 11:7 Comment(0)
J
0

Note to answer "20 above regarding Mac OSX only: If a JAR executable is transformed to an "app" via the OSX JAR BUNDLER, then the getClass().getProtectionDomain().getCodeSource().getLocation(); will NOT return the current directory of the app, but will add the internal directory structure of the app to the response. This internal structure of an app is /theCurrentFolderWhereTheAppReside/Contents/Resources/Java/yourfile

Perhaps this is a little bug in Java. Anyway, one must use method one or two to get the correct answer, and both will deliver the correct answer even if the app is started e.g. via a shortcut located in a different folder or on the desktop.

carl

SoundPimp.com

Johnny answered 20/10, 2008 at 11:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.