आवेदन का मार्ग प्राप्त करें


79

मैंने हाल ही में खोजा है कि मैं जावा में एप्लिकेशन की निर्देशिका कैसे प्राप्त कर सकता हूं। मुझे आखिरकार जवाब मिल गया है लेकिन मुझे आश्चर्यजनक रूप से लंबे समय की आवश्यकता है क्योंकि इस तरह के सामान्य शब्द की खोज आसान नहीं है। मुझे लगता है कि कई भाषाओं में इसे कैसे हासिल किया जाए, इसकी सूची तैयार करना एक अच्छा विचार है।

यदि आप (नहीं) विचार पसंद करते हैं और यदि आप इसे पसंद करते हैं तो कृपया योगदान दें।

स्पष्टीकरण:

निर्देशिका के बीच एक बारीक भेद है जिसमें निष्पादन योग्य फ़ाइल और वर्तमान कार्य निर्देशिका ( pwdयूनिक्स के तहत दी गई ) है। मैं मूल रूप से पूर्व में रुचि रखता था, लेकिन बाद के निर्धारण के लिए स्वतंत्र तरीके से पोस्ट करने के लिए स्वतंत्र महसूस करता हूं (यह स्पष्ट करता हूं कि आपका कौन सा मतलब है)।


3
आपका क्या मतलब है? वर्तमान कार्यशील निर्देशिका या वह निर्देशिका जिसमें निष्पादन योग्य कोड रहता है?
पॉल डे व्रीज़ 12

जवाबों:


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

एक ही पैकेज में java क्लासेस ... readClass ()। GetProtectionDomain ()। GetCodeSource ()। GetLocation ()। GetPath () को पूरी तरह से काम करने के लिए एक तरह से फाइल लगाने का तरीका खोज रहा था, धन्यवाद!
फजी विश्लेषण

@fuzzyanalysis वास्तव में यही Class.getResource()है।
user207421

22

में नेट (सी #, वीबी, ...) , आप वर्तमान क्वेरी कर सकता है Assemblyइसके लिए उदाहरण Location। हालाँकि, इसमें निष्पादन योग्य फ़ाइल नाम जोड़ा गया है। निम्नलिखित कोड पथ ( using System.IOऔर using System.Reflection) को sanitizes :

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

वैकल्पिक रूप से, आप AppDomainसंदर्भित असेंबली की खोज के लिए दी गई जानकारी का उपयोग कर सकते हैं :

System.AppDomain.CurrentDomain.BaseDirectory

VB Myनेमस्पेस के माध्यम से एक और शॉर्टकट की अनुमति देता है :

My.Application.Info.DirectoryPath

1
आप कुछ कार्यक्रमों के लिए Application.StartupPath का भी उपयोग कर सकते हैं। यह ASP.NET के लिए काम नहीं करेगा, हालाँकि।
जोकुल २२'११

1
वास्तव में इसके, Application.ExecutablePath
zam664

9

में विंडोज , WinAPI फ़ंक्शन का उपयोग GetModuleFileName () । वर्तमान मॉड्यूल के लिए पथ प्राप्त करने के लिए मॉड्यूल हैंडल के लिए NULL में पास करें।



5

उद्देश्य-सी कोको (मैक ओएस एक्स, मैं iPhone विशिष्टताओं के लिए नहीं जानता):

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

2
मेरे मैक OSX ऐप में, मैं एक्ज़ीक्यूटेबल फ़ाइल (एक प्लिस्ट में शामिल करने के लिए) के लिए वास्तविक पथ की तलाश कर रहा था और इसका इस्तेमाल किया: NSString * निष्पादन योग्यPath = [[NSBundle mainBundle] एक्ज़ीक्यूटेबलपैथ]; - एक स्ट्रिंग के बजाय एक URL को वापस करने के लिए एक 'एक्ज़ीक्यूटेबलएल' संस्करण भी है
टोड

4

में जावा , वहाँ आवेदन के पथ को खोजने के लिए दो तरीके हैं। एक को रोजगार देना है System.getProperty:

System.getProperty("user.dir");

एक और संभावना का उपयोग है java.io.File:

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

फिर भी एक अन्य कब्जे में प्रतिबिंब का उपयोग होता है:

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

1
ध्यान दें कि यह थोड़ा भ्रामक / भ्रमित करने वाला है। आपके द्वारा बोली जाने वाली तीन विधियां पूरी तरह से अलग परिणाम दे सकती हैं!
ज़ारकोनेंन

Zarkonnen: आप सही हैं लेकिन जैसा कि मेरी मूल पोस्टिंग में निहित है, मैं कोई विशेषज्ञ नहीं हूं। यह एक सामुदायिक विकि है। कृपया मेरे उत्तर को संपादित / सही करने के लिए स्वतंत्र महसूस करें!
कोनराड रुडोल्फ

सुझाव: आमतौर पर पथ को निर्दिष्ट करने की आवश्यकता नहीं है यदि आप वर्तमान कार्यशील निर्देशिका में किसी फ़ाइल का उपयोग करना चाहते हैं, जैसे: फ़ाइल = नई फ़ाइल ("file.cfg"); बस प्रारंभ के दौरान या एप्लिकेशन शॉर्टकट पर अपने एप्लिकेशन के स्थान पर हमेशा कार्यशील निर्देशिका सेट करना सुनिश्चित करें।
लेप

@lepe ने कार्यशील निर्देशिका को लॉन्च पर सेट नहीं किया है, इसके कुछ अवांछित परिणाम हैं, जैसे कि उपयोगकर्ता द्वारा चुनी गई कार्यशील निर्देशिका के बजाय एप्लिकेशन के पथ के लिए डिफ़ॉल्ट रूप से कुछ फ़ाइल चयनकर्ता संवादों को इंगित करना।
कोनराड रुडोल्फ

1
अंतिम दृष्टिकोण के साथ दो प्रमुख समस्याएं: एक, ProtectionDomain.getCodeSource () नल को वापस कर सकती है । दो, URL.getPath () एक फ़ाइल नाम नहीं लौटाता है, यह सिर्फ एक URL का (संभवतः बच गया) पथ भाग देता है। C:\Program Files\ExampleAppURL रूप में प्रतिनिधित्व किया जाता है file:/C:/Program%20Files/ExampleApp, जिसके लिए getPath () रिटर्न मिलता है "/C:/Program%20Files/ExampleApp", जो स्पष्ट रूप से मौजूद नहीं है। URL को फ़ाइल में बदलने का एकमात्र सही तरीका है new File(url.toURI())
वीजीआर

4

VB6 में, आप App.Pathसंपत्ति का उपयोग करके आवेदन पथ प्राप्त कर सकते हैं।

ध्यान दें कि यह एक अनुगामी \EXCEPT नहीं होगा जब अनुप्रयोग ड्राइव की जड़ में हो।

आईडीई में:

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

4

में नेट का उपयोग कर सकते

System.IO.Directory.GetCurrentDirectory

एप्लिकेशन की वर्तमान कार्यशील निर्देशिका और VB.NET में विशेष रूप से उपयोग करने के लिए

My.Application.Info.DirectoryPath

निर्वासन की निर्देशिका पाने के लिए।


3

डेल्फी

विंडोज अनुप्रयोगों में:

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

कंसोल अनुप्रयोगों में:

भाषा से स्वतंत्र, पहली कमांड लाइन पैरामीटर पूरी तरह से योग्य निष्पादन योग्य नाम है:

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

3

लिबक
इन * निक्स प्रकार का वातावरण (विंडोज में साइगविन भी):

  #include <unistd.h>

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

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

   char *get_current_dir_name(void);

मैन पेज देखें


2

यूनिक्स

यूनिक्स में एक निष्पादन योग्य पथ को पा सकता है जिसे पर्यावरण चर का उपयोग करके शुरू किया गया था। यह है नहीं : आवश्यक रूप से निरपेक्ष पथ है, तो आप वर्तमान कार्यशील निर्देशिका गठबंधन करने के लिए (शेल में की आवश्यकता होगी pwdपर्यावरण की 0'th तत्व के मूल्य के साथ और / या पथ चर)।

मान यूनिक्स में सीमित है, हालांकि, उदाहरण के लिए निष्पादन योग्य को एक प्रतीकात्मक लिंक के माध्यम से बुलाया जा सकता है, और केवल प्रारंभिक लिंक का उपयोग पर्यावरण चर के लिए किया जाता है। यदि वे किसी दिलचस्प चीज़ (जैसे कि लोडिंग संसाधन) के लिए इसका उपयोग करते हैं, तो यूनिक्स पर सामान्य अनुप्रयोग बहुत मजबूत नहीं होते हैं। यूनिक्स पर, चीजों के लिए हार्ड-कोडेड स्थानों का उपयोग करना आम है, उदाहरण के लिए एक कॉन्फ़िगरेशन फ़ाइल /etcजिसमें संसाधन स्थान निर्दिष्ट किए जाते हैं।


2

में bash , 'लोक निर्माण विभाग' कमांड वर्तमान कार्यशील निर्देशिका देता है।


दुर्भाग्यवश, pwdवर्तमान कार्य निर्देशिका को लौटाता है जो स्क्रिप्ट के पथ से भिन्न हो सकती है।
कोनराड रुडोल्फ


2

में पीएचपी :

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

एसडी कार्ड प्राप्त करने के लिए, मैं उपयोग करता हूं

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

जहाँ बाद का उपयोग एक विशेष प्रकार की फ़ाइल (ऑडियो / मूवी आदि) को संग्रहीत करने के लिए किया जाता है। आपके पास पर्यावरण वर्ग में इन स्ट्रिंग्स के लिए स्थिरांक हैं।

मूल रूप से, अनुप्रयोग का उपयोग करने के लिए कुछ के लिए ApplicationInfo वर्ग और पर्यावरण वर्ग का उपयोग करके एसडी कार्ड / बाहरी निर्देशिका में डेटा के साथ कुछ भी करने के लिए।

डॉक्स: ApplicationInfo , पर्यावरण


2

में Tcl

वर्तमान स्क्रिप्ट का पथ:

set path [info script]

खोल पथ:

set path [info nameofexecutable]

यदि आपको इनमें से किसी की निर्देशिका की आवश्यकता है, तो करें:

set dir [file dirname $path]

वर्तमान (कार्यशील) निर्देशिका प्राप्त करें:

set dir [pwd]

2

जावा:

सभी प्रणालियों पर (विंडोज, लिनक्स, मैक ओएस एक्स) मेरे लिए केवल यही काम करता है:

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

1

में रूबी निम्नलिखित स्निपेट रिटर्न वर्तमान स्रोत फ़ाइल का रास्ता:

path = File.dirname(__FILE__)

1

में CFML एक स्क्रिप्ट के रास्ते तक पहुँचने के लिए दो कार्य देखते हैं:

getBaseTemplatePath()
getCurrentTemplatePath()

कॉलिंग getBaseTemplatePath 'आधार' स्क्रिप्ट का पथ लौटाता है - यानी जो वेब सर्वर द्वारा अनुरोध किया गया था।
कॉलिंग getCurrentTemplatePath वर्तमान स्क्रिप्ट का पथ लौटाता है - अर्थात वह जो वर्तमान में निष्पादित हो रहा है।

दोनों रास्ते निरपेक्ष हैं और स्क्रिप्ट की पूरी निर्देशिका + फ़ाइल नाम शामिल हैं।

केवल निर्देशिका निर्धारित करने के लिए, फ़ंक्शन का उपयोग करें getDirectoryFromPath( ... ) परिणामों पर ।

इसलिए, किसी एप्लिकेशन की निर्देशिका स्थान निर्धारित करने के लिए, आप कर सकते हैं:

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

onApplicationStartआपके लिए घटना के अंदरApplication.cfc



उस पथ को निर्धारित करने के लिए जहां ऐप सर्वर आपके सीएफएमएल इंजन पर चल रहा है, आप शेल कमांड को cfexecute के साथ एक्सेस कर सकते हैं, इसलिए (pwd / etc पर चर्चा से ऊपर ध्यान में रखते हुए) आप कर सकते हैं:

यूनिक्स:

<cfexecute name="pwd"/>

विंडोज के लिए, एक 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

मैंने https://github.com/gpakosz/whereami जारी किया जो सी में समस्या हल करता है और आपको देता है:

  • वर्तमान निष्पादन योग्य के लिए पथ
  • वर्तमान मॉड्यूल का पथ (साझा लाइब्रेरी से कॉल करते समय पथ से निष्पादन योग्य भिन्न होता है)।

यह GetModuleFileNameWविंडोज पर उपयोग करता है, /proc/self/mapsलिनक्स और एंड्रॉइड पर पर्स और मैक और आईओएस पर _NSGetExecutablePathया उपयोग करता है dladdr


0

केवल मैक ओएसएक्स के बारे में "20 से ऊपर जवाब देने के लिए ध्यान दें: यदि एक जार निष्पादन योग्य ओएसएक्स जार बंडलेर के माध्यम से एक" ऐप "में बदल जाता है, तो getClass () .PProtectionDomain ()। GetCrotSource ()। GetLocation () वापस नहीं आएगा।" एप्लिकेशन की वर्तमान निर्देशिका, लेकिन प्रतिक्रिया के लिए एप्लिकेशन की आंतरिक निर्देशिका संरचना को जोड़ देगा। ऐप की यह आंतरिक संरचना /CurrentFolderWhereTheAppReside / Contents / Resources / Java / yourfile है

शायद यह जावा में एक छोटा सा बग है। वैसे भी, सही उत्तर प्राप्त करने के लिए किसी को विधि एक या दो का उपयोग करना चाहिए, और दोनों सही उत्तर देंगे भले ही ऐप को किसी अलग फ़ोल्डर में स्थित शॉर्टकट के माध्यम से या डेस्कटॉप पर शुरू किया गया हो।

कार्ल

SoundPimp.com

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.