জাভাতে বর্তমান ওয়ার্কিং ডিরেক্টরি কীভাবে পাবেন?


1024

আমি জাভা ব্যবহার করে আমার বর্তমান ওয়ার্কিং ডিরেক্টরিটি অ্যাক্সেস করতে চাই।

আমার কোড:

 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

আমার আউটপুট সঠিক নয় কারণ সি ড্রাইভটি আমার বর্তমান ডিরেক্টরি নয়।

কিভাবে বর্তমান ডিরেক্টরি পেতে?


2
আপনি যখন cdএই আদেশটি প্রয়োগ করেন তখন আপনার কমান্ড-প্রম্পটে কমান্ড কার্যকর করার সময় আপনি যা দেখতে পান তা এখানে আটকানতে পারেন ?
নিশান্ত

3
ওয়ার্কিং ডিরেক্টরিটি অ্যাক্সেস করে আপনি কী অর্জন করতে চাইছেন? পরিবর্তে শ্রেণি পথ ব্যবহার করে এটি করা যেতে পারে? উদাহরণস্বরূপ, আপনার যদি ফাইল সিস্টেমে কোনও পাঠ্য ফাইল পড়ার দরকার হয় তবে এটি শ্রেণীর পথে চলে গেলে আপনি সহজেই এটি সন্ধান করতে পারেন।
ইর্ডলগ্লাস

1
কীভাবে? আপনি দয়া করে বিস্তারিত বলতে পারেন?
সি গ্রাফিক্স

1
শ্রেণী পাথ একটি ফাইল অ্যাক্সেস সম্পর্কে কিছু তথ্যের জন্য, দেখুন stackoverflow.com/questions/1464291/...
downeyt

7
ডিবাগিংয়ের উদ্দেশ্যে, প্রোগ্রামিংটি বিদ্যমান ফাইলগুলিতে অ্যাক্সেস করতে সক্ষম বলে মনে হচ্ছে না কিনা তা জানতে ওয়ার্কিং ডিরেক্টরিটি দরকারী হতে পারে।
nsandersen

উত্তর:


1149
public class JavaApplication {
  public static void main(String[] args) {
       System.out.println("Working Directory = " + System.getProperty("user.dir"));
  }
}

আপনার অ্যাপ্লিকেশনটি আরম্ভ করা হয়েছিল সেখান থেকে এটি একটি সম্পূর্ণ পরম পথ মুদ্রণ করবে


ডকুমেন্টেশন থেকে :

java.ioপ্যাকেজ বর্তমান ব্যবহারকারী ডিরেক্টরি ব্যবহার করে আপেক্ষিক পথের নামগুলি সমাধান করে। বর্তমান ডিরেক্টরিটি সিস্টেম সম্পত্তি হিসাবে প্রতিনিধিত্ব করা হয়, এটি হ'ল user.dirএবং সেই ডিরেক্টরিটি যেখানে থেকে জেভিএমকে অনুরোধ করা হয়েছিল।


25
@ বুন্টুড্রয়েড: এজন্যই আমি বিশেষভাবে উল্লেখ করেছি যে এটি প্রস্থানটি যেখান থেকে অ্যাপ্লিকেশনটি শুরু করেছিল সেখান থেকে মুদ্রণ করবে। আমার অনুমান যে থ্রেড স্টার্টার কমনড প্রম্পট শুরু করার পরে সরাসরি জার / প্রোগ্রামটি পরিচালনা করে (যা মূলত সি: I উইন্ডোজ \ সিস্টেম 32 এ রয়েছে)। আমি আশা করি আপনি আমার বক্তব্য বুঝতে পেরেছেন। আপনাকে নিম্নচ্যুত মনে করে, প্রশংসা করুন যে কমপক্ষে আপনি কোনও প্রতিক্রিয়া রেখেছিলেন। :)
অনুজ প্যাটেল

1
user.dir ফোল্ডারে যাওয়ার প্রক্রিয়াটি পাবে যেখানে প্রক্রিয়াটি শুরু হয়েছিল। অ্যাপ্লিকেশনটির মূল ফোল্ডারে আসল পথ পেতে নীচে আমার উত্তরটি দেখুন।
পিটার ডি শীতকাল

1
আমার অর্থ " বর্তমান ডিরেক্টরিটি ব্যর্থ হওয়ার জন্য এটির উপর নির্ভর করে সমস্ত কোড "। সমস্ত কোড সাধারণভাবে নয়। (আমি আসল মন্তব্যটি সম্পাদনা করতে ধীর
হয়েছি

13
@ সুবપ્টিমাল যদি ব্যবহারকারী সেট -ডুসার.ডির সেট করেন তবে প্রস্তাবিত তিনি কাস্টম ওয়ার্কিং ডিরেক্টরিতে এটি চালাতে চান।
বারউনিকিক

5
@ indyaah প্রকৃতপক্ষে এই উত্তরটি ভুল, একটি ব্যবহারকারী-ডিরেক্টরি-ডিরেক্টরি এবং একটি সিস্টেম প্রক্রিয়া (সিডাব্লুডির) বর্তমান-ওয়ার্কিং-ডিরেক্টরি মধ্যে একটি সূক্ষ্ম পার্থক্য আছে; বেশিরভাগ সময় "user.dir" একটি (জাভা) প্রক্রিয়াটির সিডব্লিউডকে নির্দেশ করে; তবে "User.dir" এর বিভিন্ন শব্দার্থবিজ্ঞান রয়েছে এবং এটি জাভা প্রক্রিয়াটির সিডব্লিউডি প্রাপ্ত করতে ব্যবহৃত হবে না; বিটিডব্লিউ: জাভা প্রক্রিয়া ডকস.অরাকল.
com

380

দেখুন: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

ব্যবহার করে java.nio.file.Pathএবং java.nio.file.Paths, আপনি জাভা কীভাবে আপনার বর্তমান পথ বলে মনে করে তা নীচের জন্য করতে পারেন do এটি 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আমার ক্ষেত্রে যেখানে আমি ক্লাসটি চালিয়েছি তা ফলাফল। আপেক্ষিক উপায়ে পাথ তৈরি করা, আপনি কোনও নিখুঁত পাথ নির্মাণ করছেন তা বোঝাতে নেতৃস্থানীয় বিভাজক ব্যবহার না করে এই আপেক্ষিক পথটিকে প্রারম্ভিক পয়েন্ট হিসাবে ব্যবহার করবে।


2
প্রথমটি স্বীকৃত নয়, তবে দ্বিতীয়টি আসলে আপনার হোম ফোল্ডারটি পাবে। অ্যাপলিকেশন চলমান বর্তমান ওয়ার্কিং ডিরেক্টরি নয়।
পিটার ডি শীতকাল

12
দয়া করে ব্যবহারকারীর হোম ডিরেক্টরি ("User.home", / ব্যবহারকারী / আপনার ক্ষেত্রে জর্জি) এবং বর্তমান কার্যনির্বাহী ডিরেক্টরি ("user.dir", যা আপনার ডিরেক্টরিতে আপনি JVM শুরু করেছিলেন সেই ডিরেক্টরি হবে না , সুতরাং যেমন / ব্যবহারকারী / জর্জ / ওয়ার্কস্পেস / ফুবারপ্রজেক্ট) এর মতো কিছু হতে পারে।
ডেভিড

1
আমি এইভাবে পছন্দ। যখন আমার কার্যকারী ডিরেক্টরিটির পিতা-মাতার দরকার হয় , এটি কাজ করে নাPaths.get("").getParent() :, এটি দেয় null। এর পরিবর্তে এই কাজ করে: Paths.get("").toAbsolutePath().getParent()
ওলে ভিভি

235

নিম্নলিখিত জাভা 7 এবং উপরে কাজ করে ( ডকুমেন্টেশনের জন্য এখানে দেখুন )।

import java.nio.file.Paths;

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

11
আরও পোর্টেবলের চেয়ে এটি কীভাবে ভাল import java.io.File; File(".").getAbsolutePath()?
এভেজেনি সার্জিভ

8
আপনি যখন পোর্টেবল বলছেন, আপনার অর্থ এটি জাভা 6 এবং এর আগে কাজ করে? Paths.get()এটি আরও শক্তিশালী Pathইন্টারফেসে সরাসরি অ্যাক্সেস দেয় এটিকে আরও ভাল হিসাবে বিবেচনা করা যেতে পারে ।
ওলে ভিভি

8
.normalize()এই প্রসঙ্গে ব্যবহারের সম্ভাব্য সুবিধা কী ?
ওলে ভিভি

7
@ OleV.V। জাভাডোক থেকে: ( পদ্ধতিটি স্বাভাবিক করুন )Returns a path that is this path with redundant name elements eliminated.
স্টিফান

ইতিমধ্যে এই ক্ষেত্রে স্বাভাবিক করা হবে।
জেএম বেকার

72

এটি আপনাকে আপনার বর্তমান কার্যকরী ডিরেক্টরিটির পথ দেবে:

Path path = FileSystems.getDefault().getPath(".");

এবং এটি আপনাকে কার্যকরী ডিরেক্টরিতে "Foo.txt" নামে একটি ফাইলের পথ দেবে:

Path path = FileSystems.getDefault().getPath("Foo.txt");

সম্পাদনা করুন: বর্তমান ডিরেক্টরিটির পরম পথ পেতে:

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();

* আপডেট * বর্তমান ওয়ার্কিং ডিরেক্টরি পেতে:

Path path = FileSystems.getDefault().getPath("").toAbsolutePath();

11
এই মাত্র ফিরে '।' আমার জন্য.
জন ktejik

3
হ্যাঁ, অনেকগুলি সিস্টেমে যা ওয়ার্কিং ডিরেক্টরিতে রেফারেন্স হবে। পরম পাথ পেতে আপনি আরও একটি পদ্ধতি কল যুক্ত করতে পারেনPath path = FileSystems.getDefault().getPath(".").toAbsolutePath();
চিহ্নিত করুন

2
ডিরেক্টরি পেতে আপনার foo.txt এর দরকার নেই, খালি স্ট্রিংয়ে রাখুন
জন ktejik

1
উইন্ডোজ (10) এ এটি আমাকে কেবলমাত্র বর্তমান ওয়ার্কিং ডিরের ভিতরে Pathডাকা একটি ফাইলের দিকে নির্দেশ করে একটি অবজেক্ট দেয় ."."আমার জন্য কাজ করার চেয়ে খালি স্ট্রিং ব্যবহার করা ।
ক্রু

36

এটি আমার জন্য সমাধান

File currentDir = new File("");

1
আপনি যখন অন্য ফাইলের পিতামাতা হিসাবে এই জাতীয় কোনও অবজেক্ট ব্যবহার করেন তখন এর পার্শ্ব প্রতিক্রিয়া রয়েছে: নতুন ফাইল (নতুন ফাইল (""), "সাবডির") প্রত্যাশার মতো কাজ করবে না
MRalwasser

13
এটি ঠিক করতে, new File("").getAbsoluteFile()পরিবর্তে ব্যবহার করুন।
এমআরওয়ালওয়াসার

4
এটির মূল্যের জন্য, ফাইল ("।") দিয়ে আমার আরও ভাল ভাগ্য হয়েছিল।
কেশলাম 15

জাভাতে কীভাবে কোনও সম্পর্কিত পাথ সংজ্ঞা দেওয়া যায় এই পৃষ্ঠাটি আমাকে সহায়তা করেছিল। এছাড়াও আমি ধরে নিয়েছি যে /কোনও আপেক্ষিক পথ তৈরি করার সময় আমার ব্যবহার করা উচিত । আমি ভুল ছিল, দিয়ে শুরু করবেন না /../ডিরেক্টরি ট্রি আপ উপরে কাজ করে।
ইরেশনালকিলা

@keshlam যা আমাকে বর্তমান ডিরেক্টরিতে ডেকে একটি ফাইল দিয়েছে .
ক্রু

32

আমি মন্তব্যগুলিতে এই সমাধানটি পেয়েছি যা অন্যের চেয়ে ভাল এবং আরও বহনযোগ্য:

String cwd = new File("").getAbsolutePath();

অথবা এমনকি

String cwd = Paths.get("").toAbsolutePath();

এটি কমজিটসোম থেকে উত্তর হিসাবে ঠিক একই এবং এটি আসলে জাভা <7 উপায়
GoGoris

30

আপনাকে কী মনে করে যে সি: \ উইন্ডোজ \ সিস্টেম 32 আপনার বর্তমান ডিরেক্টরি নয়? user.dirসম্পত্তি "ব্যবহারকারী এর সাম্প্রতিক কাজ করা" বলে স্পষ্টভাবে হয়।

এটিকে অন্য কোনও উপায়ে রাখতে, আপনি যদি কমান্ড লাইন থেকে জাভা শুরু না করেন, সি: \ উইন্ডোজ \ সিস্টেম 32 সম্ভবত আপনার সিডব্লিউডি। এটি হ'ল যদি আপনি আপনার প্রোগ্রামটি শুরু করতে ডাবল ক্লিক করে থাকেন, তবে CWD যে ডিরেক্টরিটি থেকে আপনি ডাবল ক্লিক করছেন তার ডিরেক্টরি হওয়ার সম্ভাবনা কম।

সম্পাদনা : দেখা যাচ্ছে এটি কেবল পুরানো উইন্ডো এবং / অথবা জাভা সংস্করণের ক্ষেত্রেই সত্য।


2
এটি সত্য বলে মনে হচ্ছে না, জাভা using ব্যবহার করে আমার উইন্ডোজ 7. মেশিনে অন্তত নয়, user.dirধারাবাহিকভাবে ফোল্ডারটি যেখানে আমি জার ফাইলটি ডাবল ক্লিক করেছিলাম।
Jolta

26

ব্যবহার CodeSource#getLocation()

এটি JAR ফাইলগুলিতেও কাজ করে fine আপনি CodeSourceদ্বারা প্রাপ্ত করতে পারেন ProtectionDomain#getCodeSource()এবং পরিবর্তে দ্বারা প্রাপ্ত করা 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());
    }
}

2
এটি JAR ফাইলের অবস্থান ফেরত দেয়। যা চেয়েছিল তা নয়।
ব্যবহারকারী 207421

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

12
আমি যখন ডাবল ক্লিক করে একটি জেআর ফাইল থেকে আমার অ্যাপ্লিকেশন চালু করি তখন একটি এনপিই নিক্ষেপ করে।
ম্যাথু ওয়াইজ

2
""অ্যাপ্লিকেশনটি কোনও JAR ফাইল, বা একটি CLASSPATH উপাদান থেকে চলতে থাকলে এটি ফিরে আসে । যা চেয়েছিল তা নয়।
ব্যবহারকারী 207421

@ জিজোজ 212 getClass()একটি অবজেক্ট পদ্ধতি, সুতরাং স্থির প্রসঙ্গে কেবল মুছে ফেলা thisকাজ করে না। আপনি যে ক্লাসটি করেছেন সেগুলিকে স্পষ্টভাবে উল্লেখ করতে হবে MyClass.class.getClassLoader().....
ক্রু

তবুও এটি কার্যকরী ডিরেক্টরিটি ফিরিয়ে দেবে না ...
অ্যাঞ্জেল ও'স্পিয়ার

18

সাধারণত ফাইল ফাইল হিসাবে:

File getCwd() {
  return new File("").getAbsoluteFile();
}

আপনি "ডি: / এ / বি / সি" এর মতো সম্পূর্ণ যোগ্যতাসম্পন্ন স্ট্রিং পেতে চাইবেন:

getCwd().getAbsolutePath()

1
এটি অ্যান্ড্রয়েড পরীক্ষায় ভাল কাজ করে যেহেতু অ্যান্ড্রয়েডে java.nio.file.Files অন্তর্ভুক্ত করে না।
iamreptar

স্থির প্রসঙ্গে (নতুন ফাইল ("") নালপয়েন্টারএক্সসেপশন নিক্ষেপ করে) আমার পক্ষে কাজ করছে বলে মনে হচ্ছে না ..?
nsandersen

2
@ স্যানডারসন আপনি সম্ভবত একটি ভুল ফাইল অবজেক্ট ব্যবহার করেছেন: System.out.println (new java.io.File ("")। getAbsolvePath ());
comeGetSome


5

উপর লিনাক্স যখন আপনি একটি চালানোর বয়াম থেকে ফাইল টার্মিনাল , এই উভয় একই ফিরে আসবে String: "/ হোম / CurrentUser" , সেটা ব্যাপার, যেখানে Youre বয়াম ফাইল। আপনি যখন জার ফাইলটি শুরু করেন তখন এটি কেবলমাত্র আপনার টার্মিনালটির সাথে কী বর্তমান ডিরেক্টরি ব্যবহার করছে তা নির্ভর করে।

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

System.getProperty("user.dir");

আপনার Classসাথে mainযদি ফোন করা হয় MainClass, তবে চেষ্টা করুন:

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

এই ফিরে আসবে Stringসঙ্গে সুনির্দিষ্ট পাথ এর বয়াম ফাইল।


3
যা চাওয়া হয়েছিল তা নয়।
ব্যবহারকারী 207421

5

উইন্ডোজ user.dir ব্যবহার করে ডিরেক্টরিটি প্রত্যাশিত হিসাবে প্রত্যাশিত হয়, তবে যখন আপনি উচ্চতর অধিকার (অ্যাডমিন হিসাবে চালিত) দিয়ে আপনার অ্যাপ্লিকেশন শুরু করবেন না, সেক্ষেত্রে আপনি সি: I উইন্ডোজ \ সিস্টেম 32 পাবেন


3

আমি আশা করি আপনি প্যাকেজ সহ বর্তমান ডিরেক্টরিটি অ্যাক্সেস করতে চান অর্থাত্ আপনার জাভা প্রোগ্রামটি যদি থাকে 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);

দ্রষ্টব্য: এই কোডটি কেবল ওরাকল জেআরই সহ উইন্ডোজটিতে পরীক্ষা করা হয়।


6
এই উত্তরটি হ্রাস না করা অস্বীকার করা হবে। পোস্ট করার আগে আরও সাবধানে চিন্তা করুন। আপনার কোডটি নষ্ট হয়ে গেছে, যতক্ষণ না এগুলি সমস্ত সত্য হয়: 1. জেআরই ওরাকল এর, অন্যথায় "sun.java.command" সিস্টেমের সম্পত্তি থাকবে না → এনপিই; ২. ওএস হ'ল উইন্ডোজ ( File.separatorপরিবর্তে ব্যবহার করুন, বা একটি বহু-যুক্তি Fileনির্মাণকারী); ৩. ক্লাসপথটি কমান্ড লাইনে নির্দিষ্ট করা হয়েছে, এবং 'প্যাকেজ সহ বর্তমান ডিরেক্টরি' (??) হ'ল: ক। প্রথমে নির্দিষ্ট, খ। একেবারে নির্দিষ্ট, গ। সিডাব্লুডির সাথে ঠিক মিলছে (এমনকি উইন্ডোজ ক্ষেত্রে সংবেদনশীলতার সাথেও), এবং ডি। সিডাব্লুডির বংশধর
মাইকেল শ্যাপার

এটি 1 এবং 2 পয়েন্টকে সম্বোধন করে তবে আমি যদি কিছু মিস না করি তবে আপনি এখনও কমান্ড লাইনে নির্দিষ্ট হওয়া ক্লাসপথের উপর নির্ভর করছেন (যেমন কোনও পরিবেশের পরিবর্তনশীল নয়), এবং 'প্যাকেজ সহ বর্তমান ডিরেক্টরিতে' (I ক্লাসপথের বিশেষত প্রথম উপাদানটির বংশধর হয়ে আমি স্বীকার করি যে আপনি এর দ্বারা কী বোঝাচ্ছেন তা সত্যই আমি বুঝতে পারি না। আর কেস ম্যাচিংয়ের সমস্যা থেকেই যায়। আমার মন্তব্যটি সহায়ক না হলে আমি দুঃখিত; আমি মন্তব্য চরিত্রের সীমাতে থাকতে স্বচ্ছতার ত্যাগ করেছি।
মাইকেল শ্যাপার

@ ইনভারসাস, এটি কিছু পরিবেশে কেবল "পুরোপুরি কাজ করে"; আপনি কেবল ভাগ্যবান হয়ে গিয়েছিলেন যা এটি পরীক্ষা করার জন্য। বৈধ রানটাইম পরিবেশে ব্যর্থ হওয়া সফ্টওয়্যারটি লেখার পক্ষে অনুশীলন করা ভাল না, এমনকি যদি আপনার পরীক্ষার পরিবেশগুলির সেটটি সেটগুলি অন্তর্ভুক্ত করার পক্ষে যথেষ্ট পরিমাণে বিস্তৃত হয় না।
চার্লস ডাফি

@ চার্লসডুফি আপনি ঠিক বলেছেন, এটি ভাল অনুশীলন নয়। ভাগ্যক্রমে, এই সমাধানটি "আমার নির্দিষ্ট সমস্যা সমাধান করে [আইএনএন]" বৈধ রানটাইম পরিবেশে "[ব্যর্থ] হতে পারে না"। আসলে, এটি আমাকে এ জাতীয় ব্যর্থতা সমাধান করতে এবং আরও দৃ and় কোড লিখতে সহায়তা করেছিল, আমার খুব নির্দিষ্ট সমস্যাটি সমাধান করার পাশাপাশি (যা কেবল এই প্রশ্ন / উত্তরের সাথে কিছুটা সম্পর্কিত ছিল)। আমার ধারণা আমি এটির ভাগ্যবান ছিলাম।
ইনভারসাস

3

উল্লেখ করুন যে এটি কেবলমাত্র চেক করা আছে 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[StackOverFlow user] + bachden [StackOverFlow 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;
    }

এটি JAR ফাইলের অবস্থান ফেরত দেয়। যা চেয়েছিল তা নয়।
ব্যবহারকারী 207421

@EJP .jar ফাইলের অবস্থানটি জাভা প্রোগ্রামটির বর্তমান ওয়ার্কিং ডিরেক্টরি নয়?
GOXR3PLUS

2

বর্তমান জাভা ডিরেক্টরি বিভিন্ন জাভা প্রয়োগে পৃথকভাবে সংজ্ঞায়িত করা হয়। জাভা 7 এর পূর্বে নির্দিষ্ট সংস্করণের জন্য কার্যকারী ডিরেক্টরি পাওয়ার কোনও সঙ্গতিপূর্ণ উপায় ছিল না। আপনি জাভা ফাইলটি প্রবর্তন করে -Dএবং তথ্যটি ধরে রাখতে একটি ভেরিয়েবল সংজ্ঞায়িত করে কাজ করতে পারেন

কিছুটা এইরকম

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

এটি বেশ সঠিক নয়, তবে আপনি ধারণাটি পাবেন। তারপরে System.getProperty("com.mycompany.workingDir")...


6
প্রশ্নের সাথে প্রাসঙ্গিক নয়।
পিটার ডি শীতকালীন

1
জাভাটির এটির কোনও অর্থ রয়েছে - এটি ডিস্কের অবস্থান যেখানে আপনি যে ফাইলগুলি আপেক্ষিক পথের নামগুলি দিয়ে খোলেন সেটির সাথে সম্পর্কিত।
রব আমি

2
হ্যাঁ, এর একটি অর্থ রয়েছে। আমার কথাগুলি কিছুটা খারাপভাবে বেছে নেওয়া হয়েছিল। তবে আপনি এই বিষয়টিটি মিস করেন - জাভা 7 এর আগে বর্তমান কার্যনির্বাহী ডিরেক্টরিটি জানার কোনও উপায় ছিল না এবং বিভিন্ন বাস্তবায়ন তাদের সেট করে ...
অন্যভাবে

1

ধরে নিই যে আপনি আপনার প্রকল্পটি গ্রহনের ভিতরে চালানোর চেষ্টা করছেন, বা নেটবিন বা কমান্ড লাইন থেকে একা দাঁড়িয়ে আছেন। আমি এটি ঠিক করার জন্য একটি পদ্ধতি লিখেছি

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // 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 netbean
        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;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

আপনি যে কোনও জায়গায় ফাইল পড়ার জন্য বেস পাথ পেতে চান, আপনি আপনার নোঙ্গর শ্রেণিকে উপরের পদ্ধতিতে পাস করতে পারেন, ফলস্বরূপ আপনার প্রয়োজনীয় জিনিসটি হতে পারে: ডি

সেরা


2
এটি JAR ফাইলের অবস্থান ফেরত দেয়। যা চেয়েছিল তা নয়।
ব্যবহারকারী 207421

@ user207421 হ্যাঁ আমি জানি এই উত্তরটি প্রশ্নের সঠিক উত্তর নয়, তবে বেশিরভাগ সময় সবাই প্রত্যেকে "কমান্ড লাইন ওয়ার্কিং ডিরেক্টরি" এর পরিবর্তে "যেখানে জারগুলি অবস্থিত" ডিরেক্টরিটি পেতে চায়।
ব্যাডডেন

0

এখানে পোস্ট করা উত্তরগুলির কোনওটিই আমার পক্ষে কাজ করেনি। এখানে কি কাজ করেছে:

java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

সম্পাদনা করুন: আমার কোডের চূড়ান্ত সংস্করণ:

URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1) 
{}
return java.nio.file.Paths.get(myURI).toFile().toString()

এটি JAR ফাইলের অবস্থান ফেরত দেয়। যা চেয়েছিল তা নয়।
ব্যবহারকারী 207421

0

বিভ্রান্তির মুহুর্তটি কখনই ফুলে যায় এটিই আমার রূপালী বুলেট ((এটিকে মূলত প্রথম জিনিস হিসাবে কল করুন)। হতে পারে উদাহরণস্বরূপ জেভিএম আইডিই দ্বারা পৃথক সংস্করণ হতে পিছলে যায়। এই স্ট্যাটিক ফাংশনটি বর্তমান প্রক্রিয়া পিআইডি অনুসন্ধান করে এবং সেই পিডে ভিজ্যুয়ালভিএম খুলবে। বিভ্রান্তি ঠিক সেখানে থামছে কারণ আপনি এটি সব চান এবং আপনি এটি পেয়ে যান ...

  public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}


-7

এটি বর্তমান ডিরেক্টরি নাম

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

এটি বর্তমান ডিরেক্টরি পাথ

String path=folder.getPath();

1
ওপিতে আবেদনটি কোথায় চালানো হয়েছে তার বর্তমান কার্যত দির চেয়েছিলেন wanted
লাইফ গ্রুইনওয়েল্ট

এটি আপনার হোম ডিরেক্টরি, কারও বর্তমান চলমান ডিরেক্টরি নয়, সম্ভবত আপনার হতে পারে। যা চেয়েছিল তা নয়।
ব্যবহারকারী 207421
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.