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


169

আমি কীভাবে কোনও জাভা প্রোগ্রামের মধ্য থেকে বর্তমান চলমান ডিরেক্টরিটি পরিবর্তন করতে পারি? আমি সমস্যাটি সম্পর্কে সন্ধান করতে পেরেছি এমন সমস্ত কিছুই দাবি করে যে আপনি কেবল এটি করতে পারবেন না, তবে আমি বিশ্বাস করতে পারি না যে এটি সত্যই ঘটনা।

আমার একটি কোডের টুকরা রয়েছে যা সাধারণতঃ যে ডিরেক্টরিটি শুরু হয়েছিল সেখান থেকে হার্ড কোডিংযুক্ত আপেক্ষিক ফাইল পাথ ব্যবহার করে একটি ফাইল খোলায় এবং আমি কেবল কোডটি অন্য জাভা প্রোগ্রামের মধ্যে থেকে শুরু না করেই ব্যবহার করতে সক্ষম হতে চাই একটি নির্দিষ্ট ডিরেক্টরি দেখে মনে হচ্ছে আপনার কেবল কল করতে সক্ষম হওয়া উচিত System.setProperty( "user.dir", "/path/to/dir" ), তবে যতক্ষণ না আমি বুঝতে পারি, এই লাইনটি কল করে কেবল নিঃশব্দে ব্যর্থ হয় এবং কিছুই করে না।

আমি বুঝতে পারছি তাহলে জাভা আপনি এই কাজ করতে দিচ্ছে না, যদি যে এটি আপনি করতে পারবেন না থাকত পেতে , সাম্প্রতিক কাজ করা এবং এমনকি আপেক্ষিক ফাইল পাথ ব্যবহার ফাইল খুলুন আপনি করতে পারবেন ....


1
তথ্য প্রাপ্ত এবং ব্যবহার করা এটি পরিবর্তন করা থেকে পৃথক। উইন্ডোজ উদাহরণস্বরূপ আপনি সহজেই পরিবেশের ভেরিয়েবলগুলি পেতে পারেন তবে সেগুলি পরিবর্তন করা (সিস্টেমের দিক দিয়ে) আরও শক্ত।
ফিলোহো

1
bugs.java.com/bugdatedia/view_bug.do?bug_id=4045688 মূল্যায়ন বিভাগে উল্লেখ করেছে "সেই সময় থেকে, আর কোনও গ্রাহক এগিয়ে আসেনি বা অন্যভাবে সনাক্ত করা যায়নি ..." এবং 2018 এর হিসাবে আমরা প্রায় 175.000 পেয়েছি এই প্রশ্নের মতামত :-(
ওল্ফগ্যাং ফাহেল

উত্তর:


146

খাঁটি জাভাতে এটি করার কোনও নির্ভরযোগ্য উপায় নেই। user.dirমাধ্যমে সম্পত্তি নির্ধারণ করা System.setProperty()বা java -Duser.dir=...পরবর্তী ক্রিয়াকলাপগুলি প্রভাবিত করে বলে মনে হয় Filesতবে উদাহরণস্বরূপ নয় FileOutputStreams

File(String parent, String child)কন্সট্রাকটর যদি আপনি আপনার ফাইল পাথ থেকে আলাদাভাবে আপনার ডিরেক্টরির পাথ গড়তে, সহজ সোয়াপিং, যার ফলে সাহায্য করতে পারেন।

একটি বিকল্প হ'ল ভিন্ন ডিরেক্টরি থেকে জাভা চালানোর জন্য একটি স্ক্রিপ্ট সেট আপ করা, বা নীচের পরামর্শ অনুসারে জেএনআই নেটিভ কোড ব্যবহার করুন ।

প্রাসঙ্গিক সান বাগটি "ঠিক করবে না" হিসাবে 2008 সালে বন্ধ ছিল।


12
আমি মনে করি না যে আমি জাভা এবং সি # এর মধ্যে একটি মাত্র পার্থক্য খুঁজে পেয়েছি যা আমাকে ভাবতে বাধ্য করে, "এই জাভা ছেলেরা নিশ্চিত তারা জানে যে তারা কী করছে"
জেক

2
হার্ড বিশ্বাস করতে যে জাভা কিছু প্যারামিটার নেই "এই ডিরেক্টরির মধ্যে শুরু ..." অন্তত ...
rogerdpack

5
জাভার প্রতিরক্ষাতে (এবং আমি এই ইউনিক্সের লোক যা এই বৈশিষ্ট্যটি কামনা করে) ... এটি একটি ভিএম যা ওএসের বিশদগুলিতে অজ্ঞেয়বাদী বলে বোঝানো হয়েছিল। "উপস্থিত ওয়ার্কিং ডিরেক্টরি" আইডিয়ম কিছু অপারেটিং সিস্টেমে উপলভ্য নয়।
টনি কে।

4
জাভার ন্যায্য হওয়ার জন্য, তাদের প্রথমে এটি করতে হয়েছিল, সি # অনেক ক্ষেত্রে তাদের ভুল থেকে শিখতে পেরে সুবিধা পেয়েছে।
রায়ান দ্য লিচ

3
@ ভোলকারসিবিট: আরও তদন্তের পরে, মনে হয় যে ইউজার.ডির প্রথমে আমার পরীক্ষা করা ক্লাস সহ কিছু শ্রেণির জন্যই কাজ করে। new FileOutputStream("foo.txt").close();প্রোগ্রাম দ্বারা ইউজার.ডির পরিবর্তন করা হলেও মূল ওয়ার্কিং ডিরেক্টরিতে ফাইল তৈরি করে।
মাইকেল মায়ার্স

37

আপনি যদি প্রসেসবিল্ডার দিয়ে আপনার উত্তরাধিকার প্রোগ্রামটি চালনা করেন তবে আপনি এর কার্যকারী ডিরেক্টরিটি নির্দিষ্ট করতে সক্ষম হবেন ।


1
আমি যে পথটি নিয়েছি সেটির রুট। আমি নিম্নলিখিতগুলির সাথে একটি ভিন্ন ওয়ার্কিং ডিরেক্টরি থেকে এক্সিকিউটেবল চালাতে সক্ষম হয়েছি: ফাইল ওয়ার্কিংডির = নতুন ফাইল ("সি: \\ পথ \\ থেকে \\ कार्यरत \\ দির \\"); প্রসেসবিল্ডার পিবিল্ডার = নতুন প্রসেসবিল্ডার ("সি: \\ পাথ \\ টু \\ ওয়ার্কিং \\ দির \\ এক্সিকিউটেবল.এক্সে"); pBuilder.directory (WorkingDir); প্রক্রিয়া p = pBuilder.start ();
ক্যাটসএন্ডকোড

29

সেখানে হয় সিস্টেম সম্পত্তি "user.dir" ব্যবহার এই কাজ করতে একটি উপায়। বোঝার মূল অংশটি হ'ল getAbsolveFile () অবশ্যই কল করতে হবে (নীচে দেখানো হয়েছে) অথবা অন্যথায় আপেক্ষিক পথগুলি ডিফল্ট "user.dir" মানের বিপরীতে সমাধান করা হবে ।

import java.io.*;

public class FileUtils
{
    public static boolean setCurrentDirectory(String directory_name)
    {
        boolean result = false;  // Boolean indicating whether directory was set
        File    directory;       // Desired current working directory

        directory = new File(directory_name).getAbsoluteFile();
        if (directory.exists() || directory.mkdirs())
        {
            result = (System.setProperty("user.dir", directory.getAbsolutePath()) != null);
        }

        return result;
    }

    public static PrintWriter openOutputFile(String file_name)
    {
        PrintWriter output = null;  // File to open for writing

        try
        {
            output = new PrintWriter(new File(file_name).getAbsoluteFile());
        }
        catch (Exception exception) {}

        return output;
    }

    public static void main(String[] args) throws Exception
    {
        FileUtils.openOutputFile("DefaultDirectoryFile.txt");
        FileUtils.setCurrentDirectory("NewCurrentDirectory");
        FileUtils.openOutputFile("CurrentDirectoryFile.txt");
    }
}


5
তবে এটি বর্তমান ওয়ার্কিং ডিরেক্টরিটি পরিবর্তন করে না। শুধুমাত্র মান user.dir। পরম পথটি সমালোচনামূলক হয়ে ওঠে তা প্রমাণ করে।
মারকুইস

18

পিবিডাব্লুডি পরিবর্তন করা সম্ভব, জেএনএ / জেএনআই ব্যবহার করে libc এ কল করা। JRuby ছেলেরা POSIX কল করার জন্য একটি জাভা গ্রন্থাগার রয়েছে যার নাম jna-posix এখানে maven তথ্য

আপনি এর ব্যবহারের একটি উদাহরণ এখানে দেখতে পাচ্ছেন (ক্লোজার কোড, দুঃখিত)। ChdirToRoot ফাংশনটি দেখুন


1
Jna-posix এর আধুনিক সংস্করণ বলে মনে হচ্ছে না। আমি কাঁটাচামচ করে একটি যুক্ত করেছি: github.com/pbiggar/jnr-posix । আমি নিশ্চিত করতে পারি যে আমি এটি দিয়ে PWD পরিবর্তন করতে পারি।
পল বিগগার

হ্যাঁ. দুঃখিত, আমি সেই ফাইলটি রিফ্যাক্ট করেছিলাম এবং এই উত্তরটি ফাইলটির সাথে সংযুক্ত করে ভুলে গিয়েছি। সংশোধন করা হয়েছে।
অ্যালেন রোহনার

আপনি এটি করতে পারেন, তবে আপনি যদি user.dirসিস্টেমের সম্পত্তিটিও পরিবর্তন না করেন তবে এর File.getAbsolutePath()বিপরীতে সমাধান হবে user.dir, যখন ফাইলের পথের নামটি ওএস কার্যকরী ডিরেক্টরিটির বিপরীতে সমাধান হয়।
মরি

মূল প্রশ্নের সাথে সম্পর্কিত, jnr-posix ব্যবহার করে, আমি জাভাতে কীভাবে বর্তমান চলমান ডিরেক্টরিটি পরিবর্তন করতে পারি। Chdir পদ্ধতিটি ব্যবহার করার জন্য আমার কোন শ্রেণি তৈরি করতে হবে? আমি প্রদত্ত ক্লোজুর উদাহরণটি সত্যই বুঝতে পারি নি। আগাম ধন্যবাদ.
স্যাম সেন্ট-পিটারসেন

12

উল্লিখিত হিসাবে আপনি JVM এর CWD পরিবর্তন করতে পারবেন না তবে আপনি যদি রানটাইম.এক্সেক () ব্যবহার করে অন্য কোনও প্রক্রিয়া চালু করতে চান তবে আপনি ওভারলোডেড পদ্ধতিটি ব্যবহার করতে পারেন যা আপনাকে কার্যকরী ডিরেক্টরি নির্দিষ্ট করতে দেয়। এটি আপনার জাভা প্রোগ্রামটি অন্য ডিরেক্টরিতে চালিত করার জন্য নয় তবে অনেক ক্ষেত্রে যখন পার্ল স্ক্রিপ্টের মতো অন্য কোনও প্রোগ্রাম চালু করার দরকার হয়, আপনি জেভিএমের কার্যনির্বাহী ডিয়ারটি অপরিবর্তিত রেখে সেই স্ক্রিপ্টটির কার্যকরী ডিরেক্টরিটি নির্দিষ্ট করতে পারেন।

রানটাইম.এক্সেক জাভাদোকগুলি দেখুন

বিশেষ করে,

public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException

dirসাব-প্রসেসটি চালানোর জন্য ওয়ার্কিং ডিরেক্টরিটি কোথায়


1
এটি গ্রহণযোগ্য উত্তরের চেয়ে উত্তম উত্তর বলে মনে হচ্ছে (যা "খাঁটি জাভাতে এটি করার কোনও নির্ভরযোগ্য উপায় নেই with" দিয়ে শুরু হয়)। এই উত্তরটির জন্য গৃহীত উত্তর হিসাবে বিবেচনা করার জন্য আবেদনের কোনও উপায় আছে কি?
জন

11

যদি আমি সঠিকভাবে বুঝতে পারি তবে একটি জাভা প্রোগ্রামটি বর্তমান পরিবেশের ভেরিয়েবলের অনুলিপি দিয়ে শুরু হয় । এর মাধ্যমে System.setProperty(String, String)যে কোনও পরিবর্তন হ'ল অনুলিপিটি অনুলিপি করা হয়, মূল পরিবেশের ভেরিয়েবলগুলি নয়। এটি নয় যে এটি কেন সূর্য এই আচরণটি বেছে নিয়েছে তার একটি পুরো কারণ সরবরাহ করে, তবে সম্ভবত এটি কিছুটা আলোকপাত করে ...


2
আপনি পরিবেশের ভেরিয়েবল এবং বৈশিষ্ট্যগুলি মিশ্রিত করছেন বলে মনে হচ্ছে। পূর্ববর্তীটি ওএস থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয় যখন উত্তরটি ব্যবহার করে কমান্ড লাইনে সংজ্ঞায়িত করা যায় -D। তবে আমি একমত, জেভিএম এ পূর্বনির্ধারিত বৈশিষ্ট্যগুলি শুরু করুন যেমন user.dirওএস থেকে অনুলিপি করা এবং সেগুলি পরে পরিবর্তন করা কোনও লাভ হয় না।
মার্টিনাস

পরিবর্তনটি কার্যকারী ডিরেক্টরি সম্পর্কিত ওএসের ধারণাকে user.dirপ্রভাবিত করে File.getAbsolutePath()এবং File.getCanonicalPath(), ফাইলগুলিতে অ্যাক্সেস করার সময় ফাইলের নামগুলি কীভাবে সমাধান করা হয় তা নির্দেশ করে।
মরি

5

ওয়ার্কিং ডিরেক্টরি হ'ল একটি অপারেটিং সিস্টেম বৈশিষ্ট্য (প্রক্রিয়া শুরু হওয়ার পরে সেট করুন)। আপনি কেবল নিজের সিস্টেম সম্পত্তি ( -Dsomeprop=/my/path) কেন পাস করবেন না এবং এটি আপনার ফাইলের পিতামাতা হিসাবে আপনার কোডটিতে ব্যবহার করবেন না:

File f = new File ( System.getProperty("someprop"), myFilename)

কারণ কোডের টুকরোটিতে একটি হার্ড কোডড ফাইলের পাথ রয়েছে এবং সম্ভবত একটি হার্ড-কোডেড কনস্ট্রাক্টর ব্যবহার করা হয়েছে যা কাজ করতে পিতামাতাকে নির্দেশ করে না। অন্ততপক্ষে, আমার যে পরিস্থিতি রয়েছে তা হ'ল :)
ডেভিড মান

4

এখানে দক্ষতর / ​​সহজ কাজটি হ'ল কেবল আপনার কোড পরিবর্তন করা যাতে ফাইলটি খোলার পরিবর্তে এটি বর্তমান ওয়ার্কিং ডিরেক্টরিতে উপস্থিত রয়েছে তা ধরে নেওয়ার পরিবর্তে (আমি ধরে নিই যে আপনি এর মতো কিছু করছেন new File("blah.txt"), কেবল নিজেই ফাইলটির পথ তৈরি করুন।

ব্যবহারকারীটিকে বেস ডিরেক্টরিতে পাস করতে দিন, এটি একটি কনফিগার ফাইল থেকে পড়ুন, user.dirঅন্যান্য বৈশিষ্ট্যগুলি পাওয়া যায় না, যদি পিছনে যান তবে ইত্যাদি তবে কীভাবে পরিবর্তন করা যায় তার চেয়ে আপনার প্রোগ্রামে যুক্তিটি উন্নত করা আরও অনেক সহজ how পরিবেশের ভেরিয়েবল কাজ।


2

আমি অনুরোধ করার চেষ্টা করেছি

String oldDir = System.setProperty("user.dir", currdir.getAbsolutePath());

মনে হচ্ছে এটি কাজ করে। কিন্তু

File myFile = new File("localpath.ext"); InputStream openit = new FileInputStream(myFile);

FileNotFoundExceptionযদিও একটি ছুড়ে

myFile.getAbsolutePath()

সঠিক পথ দেখায় আমি এটি পড়েছি । আমি মনে করি সমস্যাটি হ'ল:

  • জাভা নতুন ডিরেক্টরিটি সহ বর্তমান ডিরেক্টরিটি জানে।
  • তবে ফাইল হ্যান্ডলিং অপারেশন সিস্টেম দ্বারা সম্পন্ন হয়। দুর্ভাগ্যক্রমে এটি নতুন সেট বর্তমান ডিরেক্টরিটি জানে না।

সমাধান হতে পারে:

File myFile = new File(System.getPropety("user.dir"), "localpath.ext");

এটি বর্তমান ডিরেক্টরিতে নিখুঁত হিসাবে একটি ফাইল অবজেক্ট তৈরি করে যা জেভিএম দ্বারা পরিচিত। তবে সেই কোডটি একটি ব্যবহৃত শ্রেণিতে বিদ্যমান থাকা উচিত, এটি পুনঃব্যবহৃত কোডগুলি পরিবর্তন করা দরকার।

~~~~ JcHartmut


"এটি একটি ফাইল অবজেক্ট তৈরি করে" - হ্যাঁ। তবে এটি ফাইল সিস্টেমে কোনও ফাইল তৈরি করে না। আপনি তার পরে file.createNewFile () ব্যবহার করতে ভুলে গেছেন।
গাংনাস

2

তুমি ব্যবহার করতে পার

নতুন ফাইল ("আপেক্ষিক / পথ")। getAbsolveFile ()

পরে

System.setProperty ("user.dir", "/ কিছু / ডিরেক্টরি")

System.setProperty("user.dir", "C:/OtherProject");
File file = new File("data/data.csv").getAbsoluteFile();
System.out.println(file.getPath());

ছাপবে

C:\OtherProject\data\data.csv

1
দয়া করে মনে রাখবেন যে জাভা 11 এ এই আচরণটি পরিবর্তিত হয়েছে, দেখুন bugs.openjdk.java.net/browse/JDK-8202127 । তারা ব্যবহার করার পরামর্শ দিচ্ছে নাSystem.setProperty("user.dir", "/some/directory")
মার্টিন

0

এই ফাইলের অন্য সম্ভাব্য উত্তর আপনি ফাইলটি খোলার কারণের উপর নির্ভর করে। এটি কোনও সম্পত্তি ফাইল বা এমন কোনও ফাইল যা আপনার আবেদনের সাথে সম্পর্কিত কিছু কনফিগারেশন রয়েছে?

যদি এমনটি হয় তবে আপনি ক্লাসপাথ লোডারটির মাধ্যমে ফাইলটি লোড করার চেষ্টা বিবেচনা করতে পারেন, আপনি জাভা যে কোনও ফাইল লোড করতে পারেন।


0

যদি আপনি শেলটিতে আপনার কমান্ডগুলি চালনা করেন তবে আপনি "java -cp" এর মতো কিছু লিখতে পারেন এবং ":" দ্বারা বিভাজনিত যে কোনও ডিরেক্টরি যুক্ত করতে পারেন: যদি জাভা একটি ডিরেক্টরিতে কিছু না খুঁজে পায় তবে এটি চেষ্টা করে অন্য ডিরেক্টরিতে সেগুলি খুঁজে পেতে পারে, আমি কি করি


0

আপনি জেএনআই বা জেএনএ ব্যবহার করে প্রক্রিয়াটির আসল কার্যকরী ডিরেক্টরিটি পরিবর্তন করতে পারেন।

জেএনআই এর সাহায্যে ডিরেক্টরিটি সেট করতে আপনি স্থানীয় ফাংশন ব্যবহার করতে পারেন। পসিক্স পদ্ধতিটি হ'ল chdir()। উইন্ডোজ, আপনি ব্যবহার করতে পারেন SetCurrentDirectory()

জেএনএর সাহায্যে আপনি জাভা বাইন্ডারগুলিতে নেটিভ ফাংশনগুলি মোড়াতে পারেন।

উইন্ডোজ জন্য:

private static interface MyKernel32 extends Library {
    public MyKernel32 INSTANCE = (MyKernel32) Native.loadLibrary("Kernel32", MyKernel32.class);

    /** BOOL SetCurrentDirectory( LPCTSTR lpPathName ); */
    int SetCurrentDirectoryW(char[] pathName);
}

পসিক্স সিস্টেমগুলির জন্য:

private interface MyCLibrary extends Library {
    MyCLibrary INSTANCE = (MyCLibrary) Native.loadLibrary("c", MyCLibrary.class);

    /** int chdir(const char *path); */
    int chdir( String path );
}

-1

ফাইলসিস্টেমভিউ ব্যবহার করুন

private FileSystemView fileSystemView;
fileSystemView = FileSystemView.getFileSystemView();
currentDirectory = new File(".");
//listing currentDirectory
File[] filesAndDirs = fileSystemView.getFiles(currentDirectory, false);
fileList = new ArrayList<File>();
dirList = new ArrayList<File>();
for (File file : filesAndDirs) {
if (file.isDirectory())
    dirList.add(file);
else
    fileList.add(file);
}
Collections.sort(dirList);
if (!fileSystemView.isFileSystemRoot(currentDirectory))
    dirList.add(0, new File(".."));
Collections.sort(fileList);
//change
currentDirectory = fileSystemView.getParentDirectory(currentDirectory);

আমদানি করুন javax.swing.filechooser.FileSystemView;
বোর্নেক

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