응용 프로그램의 경로 가져 오기


79

최근에 Java에서 응용 프로그램의 디렉토리를 얻는 방법을 검색했습니다. 마침내 답을 찾았지만 그러한 일반적인 용어를 검색하는 것이 쉽지 않기 때문에 놀랍도록 오래 필요했습니다. 여러 언어로 이것을 달성하는 방법 목록을 컴파일하는 것이 좋은 생각이라고 생각합니다.

아이디어가 마음에 들지 않으면 자유롭게 업 / 다운 투표하고 마음에 들면 기여해주세요 .

설명:

실행 파일이 포함디렉토리현재 작업 디렉토리 ( pwdUnix에서 제공) 사이에는 미세한 차이 가 있습니다 . 나는 원래 전자에 관심이 있었지만 후자를 결정하는 방법도 자유롭게 게시 할 수 있습니다 (어떤 것을 의미하는지 명확히 함).


3
무슨 길을 의미합니까? 현재 작업 디렉토리 또는 실행 코드가있는 디렉토리?
Paul de Vrieze

답변:


59

에서 자바 호출은

System.getProperty("user.dir")

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

현재 작업 디렉토리를 반환합니다.

호출

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

현재 클래스를 포함하는 JAR 파일의 경로 또는 파일 시스템에서 직접 실행중인 경우 현재 클래스를 생성 한 CLASSPATH 요소 (경로)를 반환합니다.

예:

  1. 신청서는 다음 위치에 있습니다.

     C:\MyJar.jar
    
  2. 셸 (cmd.exe)과 cdC : \ test \ subdirectory를 엽니 다 .

  3. 명령을 사용하여 응용 프로그램을 시작합니다 java -jar C:\MyJar.jar.

  4. 처음 두 번의 호출은 'C : \ test \ subdirectory'를 반환합니다. 세 번째 호출은 'C : \ MyJar.jar'을 반환합니다.

JAR 파일이 아닌 파일 시스템에서 실행할 때 결과는 생성 된 클래스 파일의 루트 경로가됩니다.

c:\eclipse\workspaces\YourProject\bin\

경로에는 생성 된 클래스 파일의 패키지 디렉토리가 포함되지 않습니다.

.jar 파일 이름없이 애플리케이션 디렉토리를 가져 오거나 파일 시스템에서 직접 실행하는 경우 (예 : 디버깅시) 클래스 파일에 대한 해당 경로를 가져 오는 완전한 예제 :

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

if (applicationDir.endsWith(".jar"))
{
    applicationDir = new File(applicationDir).getParent();
}
// else we already have the correct answer

읽기 전용 파일을 자바 클래스와 동일한 패키지에 넣는 방법을 찾고있었습니다 ... getClass (). getProtectionDomain (). getCodeSource (). getLocation (). getPath ()가 완벽하게 작동했습니다. 감사합니다!
퍼지 분석

@fuzzyanalysis 그게 바로 그 이유 Class.getResource()입니다.
user207421 dec.

22

에서 .NET (C #을, VB, ...) , 현재 조회 할 수 있습니다 Assembly자신에 대한 인스턴스를 Location. 그러나 여기에는 실행 파일의 이름이 추가됩니다. 다음 코드는 경로 ( using System.IOusing System.Reflection)를 삭제합니다 .

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

또는에서 제공된 정보를 사용하여 AppDomain참조 된 어셈블리를 검색 할 수 있습니다 .

System.AppDomain.CurrentDomain.BaseDirectory

VB는 My네임 스페이스 를 통해 다른 바로 가기를 허용 합니다.

My.Application.Info.DirectoryPath

1
일부 프로그램에는 Application.StartupPath를 사용할 수도 있습니다. 하지만 ASP.NET에서는 작동하지 않습니다.
jocull

1
사실은, Application.ExecutablePath
zam664


7

파이썬

path = os.path.dirname(__file__)

현재 모듈의 경로를 가져옵니다.


5

Objective-C Cocoa (Mac OS X, iPhone 사양에 대해 잘 모릅니다) :

NSString * applicationPath = [[NSBundle mainBundle] bundlePath];

2
내 Mac OSX 앱에서 실행 파일의 실제 경로 (plist에 포함)를 찾고 이것을 사용했습니다. NSString * executablePath = [[NSBundle mainBundle] executablePath]; -문자열 대신 URL을 반환하는 'executableURL'버전도 있습니다
Todd

4

Java 에서는 애플리케이션의 경로를 찾는 두 가지 방법이 있습니다. 하나는 다음을 사용하는 것입니다 System.getProperty.

System.getProperty("user.dir");

또 다른 가능성은 다음을 사용하는 것입니다 java.io.File.

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

또 다른 가능성은 반사를 사용합니다.

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

1
이것은 약간 오해의 소지가 있거나 혼란 스럽습니다. 당신이 인용하는 세 가지 방법은 완전히 다른 결과를 줄 수 있습니다!
Zarkonnen

Zarkonnen : 당신 말이 맞지만 제 원래 포스팅에서 알 수 있듯이 저는 전문가가 아닙니다. 이것은 커뮤니티 위키입니다. 제 답변을 자유롭게 수정 / 수정하십시오!
Konrad Rudolph

팁 : 일반적으로 현재 작업 디렉토리의 파일에 액세스하려는 경우 경로를 지정할 필요가 없습니다. file = new File ( "file.cfg"); 초기화 중 또는 응용 프로그램 바로 가기에서 항상 작업 디렉토리를 응용 프로그램의 위치로 설정하십시오.
lepe

@lepe 시작할 때 작업 디렉터리를 설정하지 마십시오. 이것은 일부 파일 선택기 대화 상자가 기본적으로 사용자가 선택한 작업 디렉터리가 아닌 응용 프로그램의 경로를 가리 키도록하는 것과 같은 원치 않는 결과를 가져옵니다.
Konrad Rudolph 2011

1
마지막 접근 방식의 두 가지 주요 문제 : 하나는 ProtectionDomain.getCodeSource ()가 null을 반환 할 수 있다는 것 입니다. 둘째, URL.getPath ()는 파일 이름을 반환하지 않고 URL의 (이스케이프 처리 된) 경로 부분 만 반환합니다. C:\Program Files\ExampleAppURL 형식으로으로 표시되며 file:/C:/Program%20Files/ExampleAppgetPath ()가를 반환 "/C:/Program%20Files/ExampleApp"하며 분명히 존재하지 않습니다. URL을 파일로 변환하는 유일한 올바른 방법은 new File(url.toURI()).
VGR

4

VB6에서는 App.Path속성을 사용하여 응용 프로그램 경로를 가져올 수 있습니다 .

\응용 프로그램이 드라이브의 루트에있는 경우 뒤에는 EXCEPT 가 없습니다 .

IDE에서 :

?App.Path
C:\Program Files\Microsoft Visual Studio\VB98

4

.Net 에서는 다음을 사용할 수 있습니다.

System.IO.Directory.GetCurrentDirectory

응용 프로그램의 현재 작업 디렉토리를 얻으려면 특히 VB.NET에서 다음을 사용할 수 있습니다.

My.Application.Info.DirectoryPath

exe의 디렉토리를 가져옵니다.


3

델파이

Windows 애플리케이션에서 :

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

콘솔 애플리케이션에서 :

언어와 관계없이 첫 번째 명령 줄 매개 변수는 완전한 실행 파일 이름입니다.

Unit System;
path := ExtractFilePath(ParamStr(0));

3

Libc
In * nix 유형 환경 (Windows에서도 Cygwin) :

  #include <unistd.h>

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

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

   char *get_current_dir_name(void);

맨 페이지 참조


2

유닉스

유닉스에서는 환경 변수를 사용하여 시작된 실행 파일의 경로를 찾을 수 있습니다. 반드시 절대 경로 일 필요 는 없으므로 현재 작업 디렉토리 (셸 pwd:) 및 / 또는 PATH 변수를 환경의 0 번째 요소 값과 결합해야합니다.

그러나 실행 파일은 예를 들어 심볼릭 링크를 통해 호출 될 수 있고 환경 변수에는 초기 링크 만 사용되므로 유닉스에서는 값이 제한됩니다. 일반적으로 유닉스의 응용 프로그램은 흥미로운 일 (예 : 리소스로드)에 이것을 사용하면 그다지 강력하지 않습니다. 유닉스에서는 /etc리소스 위치가 지정된 구성 파일과 같이 하드 코딩 된 위치를 사용하는 것이 일반적 입니다.



2

에서 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).
?>

2

에서 안드로이드

getApplicationInfo().dataDir;

SD 카드를 얻으려면

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

후자는 특정 유형의 파일 (오디오 / 영화 등)을 저장하는 데 사용됩니다. 환경 클래스에 이러한 문자열에 대한 상수가 있습니다.

기본적으로 앱과 관련된 모든 것은 ApplicationInfo 클래스를 사용하고 SD 카드 / 외부 디렉토리의 데이터와 관련된 모든 작업은 Environment 클래스를 사용합니다.

문서 : ApplicationInfo , 환경


2

에서 티클

현재 스크립트 경로 :

set path [info script]

Tcl 셸 경로 :

set path [info nameofexecutable]

이러한 디렉토리가 필요한 경우 다음을 수행하십시오.

set dir [file dirname $path]

현재 (작업) 디렉토리 가져 오기 :

set dir [pwd]

2

자바:

모든 시스템 (Windows, Linux, Mac OS X)에서 저에게만 작동합니다.

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;
}

애플리케이션이 JAR 파일에서 실행중인 경우 NPE가 발생합니다.
user207421 dec.

1

루비 , 다음 코드는 현재 소스 파일의 경로를 반환합니다 :

path = File.dirname(__FILE__)

1

에서 CFML 스크립트의 경로를 액세스하기위한 두 가지 기능이 있습니다 :

getBaseTemplatePath()
getCurrentTemplatePath()

getBaseTemplatePath를 호출하면 'base'스크립트의 경로, 즉 웹 서버에서 요청한 경로를 반환합니다.
getCurrentTemplatePath를 호출하면 현재 스크립트의 경로, 즉 현재 실행중인 스크립트가 반환됩니다.

두 경로 모두 절대적이며 스크립트의 전체 디렉토리 + 파일 이름을 포함합니다.

디렉터리 만 확인하려면 getDirectoryFromPath( ... )결과에 대한 함수 를 사용하십시오 .

따라서 응용 프로그램의 디렉터리 위치를 확인하려면 다음을 수행 할 수 있습니다.

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

onApplicationStart당신을위한 이벤트의 내부Application.cfc



CFML 엔진을 실행하는 앱 서버가있는 경로를 확인하려면 cfexecute를 사용하여 셸 명령에 액세스 할 수 있습니다.

유닉스 :

<cfexecute name="pwd"/>

Windows의 경우 pwd.bat포함하는 텍스트를 만들고 @cd다음을 수행합니다.

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

( 화면에 출력하는 대신 값을 저장 하려면의 variable속성을 사용하십시오 cfexecute.)


1

cmd (Microsoft 명령 줄 셸)

% * (pwd에 상대적 일 수 있음)를 사용하여 스크립트 이름을 가져올 수 있습니다.

이것은 스크립트의 디렉토리를 가져옵니다.

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

버그를 찾으면 그럴 것입니다. 그런 다음 수정하거나 의견을 말하십시오.


1

C에서 문제를 해결하고 다음을 제공하는 https://github.com/gpakosz/whereami 를 출시했습니다 .

  • 현재 실행 파일의 경로
  • 현재 모듈에 대한 경로 (공유 라이브러리에서 호출 할 때 실행 파일 경로와 다름)

GetModuleFileNameWWindows에서 사용 하고 /proc/self/mapsLinux 및 Android 에서 구문 분석 하고 Mac 및 iOS에서 _NSGetExecutablePath또는 사용합니다 dladdr.


0

Mac OSX에 대해서만 위의 20 번 대답에 대한 참고 : JAR 실행 파일이 OSX JAR BUNDLER를 통해 "앱"으로 변환되면 getClass (). getProtectionDomain (). getCodeSource (). getLocation (); 앱의 현재 디렉터리이지만 응답에 앱의 내부 디렉터리 구조를 추가합니다. 앱의 내부 구조는 / theCurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile입니다.

아마도 이것은 Java의 작은 버그 일 것입니다. 어쨌든, 하나 또는 두 가지 방법을 사용하여 정답을 얻어야하며, 둘 다 앱이 시작 되더라도 예를 들어 다른 폴더 나 바탕 화면에있는 바로 가기를 통해 정답을 제공합니다.

SoundPimp.com

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.