java - जावा में वर्तमान कार्य निर्देशिका प्राप्त करना




working-directory (13)

Windows user.dir का उपयोग निर्देशिका को अपेक्षित रूप से देता है, लेकिन जब आप अपना अधिकार उच्च अधिकारों (व्यवस्थापक के रूप में चलाएं) के साथ शुरू करते हैं, तो उस स्थिति में आपको C: \ WINDOWS \ system32 मिलता है

मैं अपने मौजूदा कामकाजी निर्देशिका का उपयोग कर उपयोग करना चाहता हूं

 String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);

आउटपुट:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

मेरा आउटपुट सही नहीं है क्योंकि सी ड्राइव मेरी वर्तमान निर्देशिका नहीं है। इस संबंध में मदद की ज़रूरत है।


आपको क्या लगता है कि c: \ windows \ system32 आपकी वर्तमान निर्देशिका नहीं है? user.dir प्रॉपर्टी स्पष्ट रूप से "उपयोगकर्ता की वर्तमान कार्य निर्देशिका" होने के लिए है।

इसे एक और तरीका रखने के लिए, जब तक आप कमांड लाइन से जावा प्रारंभ नहीं करते हैं, c: \ windows \ system32 शायद आपका सीडब्ल्यूडी है। यही है, यदि आप अपने प्रोग्राम को शुरू करने के लिए डबल-क्लिक कर रहे हैं, तो सीडब्ल्यूडी उस निर्देशिका होने की संभावना नहीं है जिसे आप डबल क्लिक कर रहे हैं।

संपादित करें : ऐसा प्रतीत होता है कि यह केवल पुरानी विंडो और / या जावा संस्करणों के लिए सच है।


जावा 7 और ऊपर के लिए निम्नलिखित कार्य (दस्तावेज़ीकरण के लिए here देखें)।

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();

देखें: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

java.nio.file.Path और java.nio.file.Paths का उपयोग करके, आप यह दिखाने के लिए निम्न कार्य कर सकते हैं कि जावा क्या सोचता है आपका वर्तमान पथ है। यह 7 और बाद के लिए, और एनआईओ का उपयोग करता है।

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);

यह Current relative path is: /Users/george/NetBeansProjects/Tutorials आउटपुट करता Current relative path is: /Users/george/NetBeansProjects/Tutorials जो मेरे मामले में है जहां से मैं कक्षा चलाता हूं। पथ को एक सापेक्ष तरीके से बनाना, एक अग्रणी विभाजक का उपयोग न करने के लिए यह इंगित करने के लिए कि आप एक पूर्ण पथ बना रहे हैं, इस सापेक्ष पथ को शुरुआती बिंदु के रूप में उपयोग करेंगे।


मुझे आशा है कि आप पैकेज सहित वर्तमान निर्देशिका तक पहुंचना चाहते हैं यानी यदि आपका जावा प्रोग्राम c:\myApp\com\foo\src\service\MyTest.java और आप c:\myApp\com\foo\src\service तो आप निम्न कोड आज़मा सकते हैं:

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("sun.java.command")
                    .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);

नोट: यह कोड केवल ओरेकल जेआरई के साथ विंडोज में परीक्षण किया जाता है।



यह मेरे लिए समाधान है

File currentDir = new File("");

यह वर्तमान निर्देशिका नाम है

String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();

यह वर्तमान निर्देशिका पथ है

String path=folder.getPath();

वर्तमान कार्य निर्देशिका को विभिन्न जावा कार्यान्वयन में अलग-अलग परिभाषित किया गया है। जावा 7 से पहले कुछ संस्करण के लिए कार्यशील निर्देशिका प्राप्त करने के लिए कोई निरंतर तरीका नहीं था। आप जावा फ़ाइल को -D साथ लॉन्च करके और जानकारी को पकड़ने के लिए एक चर परिभाषित करके इसके आसपास काम कर सकते हैं

कुछ इस तरह

java -D com.mycompany.workingDir="%0"

यह बिल्कुल सही नहीं है, लेकिन आपको विचार मिलता है। फिर System.getProperty("com.mycompany.workingDir") ...


CodeSource#getLocation() प्रयोग करें।

यह जेएआर फाइलों में भी ठीक काम करता है। आप ProtectionDomain#getCodeSource() द्वारा CodeSource प्राप्त कर सकते हैं और बदले में ProtectionDomain Class#getProtectionDomain() द्वारा प्राप्त किया जा सकता है।

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

उल्लेख करें कि यह केवल Windows में चेक किया गया है लेकिन मुझे लगता है कि यह अन्य ऑपरेटिंग सिस्टम [ Linux,MacOs,Solaris ] पर सही काम करता है :)।

मेरे पास एक ही निर्देशिका में 2 .jar फ़ाइलें थीं। मैं एक .jar फ़ाइल से दूसरे .jar फ़ाइल को शुरू करने के लिए चाहता था जो एक ही निर्देशिका में है।

समस्या यह है कि जब आप इसे cmd से प्रारंभ करते हैं तो वर्तमान निर्देशिका system32

चेतावनी!

  • नीचे दिए गए सभी परीक्षणों में मैंने नीचे दिए गए परीक्षण में बहुत अच्छा काम किया है ;][[;'57f2g34g87-8+9-09!2#@!$%^^&() या ()%&$%^@# यह अच्छी तरह से काम करता है।
  • मैं ProcessBuilder का उपयोग नीचे निम्नानुसार कर रहा हूं:

🍂 ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

getBasePathForClass(Class<?> classs) :

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[ user] + bachden [ user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbeans
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    }

लिनक्स पर जब आप टर्मिनल से जार फ़ाइल चलाते हैं, तो ये दोनों एक ही String को वापस कर देंगे: "/ home / CurrentUser" , कोई फर्क नहीं पड़ता, आप जार फ़ाइल कहां हैं। जब आप जार फ़ाइल शुरू करते हैं, तो यह केवल उस पर निर्भर करता है कि आप अपने टर्मिनल के साथ किस मौजूदा निर्देशिका का उपयोग कर रहे हैं।

Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");

यदि main Class साथ आपकी Class को main Class कहा जाएगा, तो कोशिश करें:

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

यह जार फ़ाइल के पूर्ण पथ के साथ एक String वापस करेगा।


this.getClass().getClassLoader().getResource("").getPath()




working-directory