ফাইল.এক্সিজিট () ফাইল উপস্থিত থাকলে মিথ্যা ফিরিয়ে দেয়


90

আমি একটি ত্রুটির মুখোমুখি হয়েছি আমি এর পিছনে কোনও যুক্তি খুঁজে পাচ্ছি না। আমার এই ফাইল অবজেক্টটি রয়েছে, যা এই জাতীয়ভাবে তৈরি করা হয়েছে:

File file = new File("utilities/data/someTextFile.txt");

আমি তখন করি file.exists(), এবং এটি false(!?) ফিরে আসে । যদি ফাইলটি না পাওয়া যায় তবে আমি f.getAbsolutePath()কোনও ফাইলে লগইন করছি । আমি যখন পথটি দেখি, মনে হয় ঠিক আছে। আমি উইন্ডোজ "উইন্ডো" -র সম্পূর্ণ পথটি অনুলিপি-পেস্ট করতে পারি এবং ফাইলটি সূক্ষ্ম খোলে।

ফাইলটি সর্বদা বিদ্যমান এবং আমার অ্যাপ্লিকেশন চলাকালীন মুছে ফেলা হয় না বা পরিবর্তিত হয় না। এটি স্থানীয় মেশিনে অবস্থিত।

এটি কেবল নির্দিষ্ট পরিস্থিতিতে ঘটেছিল বলে মনে হয়। আমি যে কোনও সময় ত্রুটিটি পুনরুত্পাদন করতে পারি তবে আমি নিশ্চিত যে আমি ফল্টটির পুনরুত্পাদন করার জন্য করা ক্রিয়াগুলি দ্বারা ফাইল অবজেক্টের পথ পরিবর্তন করা হয়নি।

file.exists()মিথ্যা ফিরে আসতে কি হতে পারে ? এর অনুমতি বা ফাইল লক ইত্যাদির সাথে কিছু করার আছে?


সুতরাং, উপস্থিত থাকা সত্ত্বেও () মিথ্যা প্রমাণিত হয়ে ফাইল থেকে পড়া কি সম্ভব?
হ্যারি লাইম

হ্যাঁ, উপস্থিত থাকা সত্ত্বেও আমি ফাইলটি পড়তে পারি () মিথ্যা বলে মনে করে।
atsjoo

4
দোষটি পুনরুত্পাদন করার জন্য ঠিক কী দরকার?
ব্যবহারকারী 85421

4
এটি ম্যাট্লাবের লিখিত ফাংশনগুলিকে কল করে এবং জাভা অ্যাপ্লিকেশনটিতে সংকলিত একটি অ্যাপ্লিকেশনের অভ্যন্তরে। এটি ম্যাটলব ফাংশনের মতো বলে মনে হচ্ছে যা "বর্তমান ডিরেক্টরি" পরিবর্তন করে যা সমস্যা দেখা দিচ্ছে। ফাইল অবজেক্ট তৈরি করার সময় আমি পরম পথটি ব্যবহার করছি, সুতরাং এটি কোনও সমস্যা হওয়া উচিত নয় - তবে এটি মনে হয়। আমি অবশ্যই ফাইল অবজেক্টের পরম পথটি যাচাই করেছি, এবং এটি সঠিক (ম্যাটলব ফাংশনটি বর্তমান ডিরেক্টরি পরিবর্তনের আগে যেমন ছিল তেমন)।
atsjoo

7
আপনি কি কোনও সুযোগে দূরবর্তী ডিরেক্টরি (যেমন এনএফএস মাউন্ট) এর বিপরীতে কাজ করছেন?
টোমর গ্যাবেল

উত্তর:


42

আমি উইন্ডোজ 7 এ নিম্নলিখিত পরিস্থিতিটি দেখছি:

file.exists() == false
file.getAbsoluteFile().exists() == true

প্রশ্নে থাকা ফাইলটি হ'ল "ভার \ লগ" the এটি আইডিই থেকে দেখা যায়।


17
আমি কেবল এটি সন্ধান করেছি: bugs.sun.com/bugdatedia/view_bug.do ; : YfiG?bug_id=4483097 স্পষ্টতই, ফাইলটিতে চলমান ক্রিয়াকলাপগুলি বর্তমান ডিরেক্টরিটির বিরুদ্ধে সমাধান করা হয়, যখন getAbsolvePath ইউজারআরডির বিরুদ্ধে সমাধান করে। যদি এই দুটি পথ মেলে না, আপনি বিরোধমূলক ফলাফল পাবেন। শয়তান!
রোমান জেনকা

4
আমার ঠিক একই সমস্যা আছে আমি ফাইল দুটি আছে কিনা তা পরীক্ষা করতে উভয় পদ্ধতি ব্যবহার করার চেষ্টা করেছি এবং এখনও আমি কেবল উইন্ডোজ 7 এ মিথ্যা পেয়েছি! কোন ধারণা?
ডিজেল

@ ওডেলিয়া: আপনি কোন আইডিই ব্যবহার করছেন? আপনার -Duser.dir কি সেট করা আছে? আমার সমস্যাটি বর্তমান কর্মক্ষমের চেয়ে আলাদা ডিরেক্টরিতে -Duser.dir সেট করার কারণে হয়েছিল।
রোমান জেনকা

4
যে কেউ ডায়নামিক ওয়েব প্রকল্পে কাজ করছেন, ফাইল.এক্সিস্টগুলি () ব্যবহার করে একটি ব্যতিক্রম ছুঁড়ে ফেলা হবে, ডাব্লুইইবি-আইএনএফ ডিরেক্টরিতে (সাধারণ টিপ, উইন্ডোজ specific নির্দিষ্ট নয়) ফাইলগুলি পরীক্ষা করার জন্য ফাইল.গেট অ্যাবসুলিউটফিল () উপস্থিত রয়েছে () ব্যবহার করুন) )।
পিএস

এই উত্তর এবং মন্তব্যের জন্য পৃথক কিউএ তৈরির কথা বিবেচনা করুন
বাটো-বেয়ার টিসিরেনভ

17

দেখে মনে হচ্ছে জাভাতে কীভাবে পথটি নির্দিষ্ট করা হয়েছে তার মধ্যে কোনও পার্থক্য রয়েছে।

উদাহরণস্বরূপ, যদি ফাইল পাথটি file:/C:/DEV/test.txtততক্ষণ নির্দিষ্ট করা থাকে

File f = new File(filename);
f.exists();

ফিরে আসবে false। পাথটি এক্সপ্লোরার বা ব্রাউজারে কাজ করতে পারে তবে এটি একটি URL এবং পরম ফাইল পাথ নয়।

তবে অন্যদিকে যদি ফাইল পাথটি C:/DEV/test.txtততক্ষণ নির্দিষ্ট করা থাকে

File f = new File(filename);
f.exists();

ফিরে আসবে trueকারণ পথটি ইউআরএল নয়, তবে এটি একটি পরম পথ।

সঙ্গে স্প্রিং ফ্রেমওয়ার্ক যে ঠিক কি ResourceUtils.getFile(filename)যেখানে নাম হয় একটি URL বা পরম ফাইল পাথ হতে পারে - না।


4
আমি file:/C:/DEV/test.txtপথের নাম হিসাবে কাজ করার আশা করব না । এটি কোনও ইউআরএল, কোনও পথের নাম নয়। কিছু লোক এই ভুলটি করার সময়, ওপি-র কোনও প্রমাণ নেই ...
স্টিফেন সি

15

প্রক্রিয়াটির কোনও ফাইল উপস্থিত রয়েছে কিনা তা জানার অনুমতি না থাকলে এটি মিথ্যা হয়ে যাবে। কোনও ফাইল খোলানো সম্ভব হতে পারে, তবে এটি উপস্থিত থাকলে সাধারণ পদ্ধতি দ্বারা বলবেন না।


20
মজাদার. আপনি এই উপর প্রসারিত করতে পারেন? আপনার কোন নির্দিষ্ট অনুমতিগুলি মনে আছে?
ক্লাইমেন্ট

এখানে java.nio.file.AccessDeniedException ব্লক করার ক্ষমতা ফাইল / dir অস্তিত্ব পৌঁছানোর ক্ষমতা হতে পারে। উদাহরণস্বরূপ, আপনি যদি ডিআর এফআর বা অন্য ফাইল এক্সপ্লোরারটিতে খোলা রাখেন, তবে সমস্ত নেস্টেড ফাইল সহ ডিরটিকে মুছুন এবং এই দিরের অস্তিত্ব পরীক্ষা করুন, তারপরে আপনি আপনার জন্য রাখা অস্থায়ী ফাইলের জন্য অ্যাক্সেসডিনিডএক্সেপশন (আইওএক্সেপশন প্রসারিত) পেতে পারেন। এই ক্ষেত্রে ফাইল.এক্সিজিস্টগুলি IOException এর জন্য মিথ্যা ফিরিয়ে দেয়।
বেলুহা

11

উপরের উত্তরগুলি আমার ক্ষেত্রে সাহায্য করতে পারেনি। উপরে বর্ণিত হিসাবে, আমার ছিল:

file.exists() => false
file.getAbsoluteFile().exists => true

এর মূল কারণটি হ'ল উইন্ডোজ machine মেশিনের মালিক সিএমডির জন্য রেজিস্ট্রিটি সংশোধন করেছিলেন যাতে এটি পাইথনের সাথে কাজ করার জন্য একটি নির্দিষ্ট ডিরেক্টরি চালু করার জন্য একটি কমান্ড স্বয়ত্তর করতে পারে। এই পরিবর্তণ বিকলাঙ্গ জাভা 1.6 কোড যা দৃশ্যত ব্যবহার সিএমডি উপর উইন্ডোজ যেমন কিছু নির্দিষ্ট প্রকারের ফাইল অপারেশন, জন্য exists()। রেজিস্ট্রি থেকে অটোরুনকে সরিয়ে নিয়ে সমস্যার সমাধান হয়েছে।


4
3.5 বছর পরে, এবং আমি একই ইস্যুতে ছুটে এসেছি। আমি যখনই cmd.com চালু করি তখন প্রতিবার পরিবেশের ভেরিয়েবলগুলি কনফিগার করতে আমার একটি অটোরান স্ক্রিপ্ট ছিল। এটি বর্তমান ডিরেক্টরিটিও পরিবর্তন করে নি - কেবল কয়েকটি ডসকি ম্যাক্রো এবং কিছু পরিবেশের ভেরিয়েবল। আমি অটোরুনটি সরিয়ে নিয়েছি, এবং কেবলমাত্র ফাইলটিতে কমান্ডগুলি ম্যানুয়ালি চালিয়েছি এবং হঠাৎ ফাইল.এক্সিজিস্ট () সঠিকভাবে কাজ করে।
হোমার জোডিসি

4
ওএমজি, এটি সত্যিই কাজ করে (এটি উভয়), আমি কেবল নির্লজ্জভাবে ভুল ফাইলটি পরীক্ষা করে দেখছিলাম এবং কেন এগুলি কেউ আমার জন্য কাজ করেন না তা জানতে এই প্রশ্নটি এসেছিল :) বিটিডাব্লু, মনে ()হয় এটি দ্বিতীয় লাইনে অনুপস্থিত রয়েছে exists; )
রম 237

3

যখন ["পরিচিত ফাইলের ধরণের জন্য এক্সটেনশানগুলি লুকান।"] উইন্ডোজ চেক করা হয় "t.txt.txt" যখন [এক্সপ্লোরার] / [উইন্ডো চালান] তে "t.txt" টাইপ করেন তবে প্রোগ্রামগতভাবে হয় না।


4
আমার এই সমস্যাটি ছিল এবং সমস্যাটি হ'ল আমি একটি txt ফাইল তৈরি করেছি, যা সি: \ পরীক্ষায় 'testFile.txt' নামে পরিচিত। আমি এই ফাইলটি সি: \ পরীক্ষা \ টেস্টফিল.টেক্সট ব্যবহার করে উল্লেখ করেছি, যা কাজ করে না। ফাইলটি সত্যই টেস্টফিল.টিএসটিএসটিএসটি হিসাবে সংরক্ষণ করা হয়েছিল, সুতরাং উপরের সমাধানটির উপরে ভোট দিন (পুরানো প্রশ্ন, তবে কোনও উত্তর গৃহীত হয়নি!)
থেব্লেকনাট

গড উইন্ডোজ এত চুষে দেয়।
এএফসি

3

স্পষ্টতই বেশ কয়েকটি সম্ভাব্য কারণ রয়েছে এবং পূর্ববর্তী উত্তরগুলি সেগুলি ভাল করে ডকুমেন্ট করে, তবে একটি বিশেষ ক্ষেত্রে আমি কীভাবে এটি সমাধান করেছি তা এখানে:

আমার এক শিক্ষার্থীর এই সমস্যা ছিল এবং আমি এটি বের করার চেষ্টা করে আমার চুল প্রায় ছিঁড়ে ফেলেছিলাম। দেখা গেল যে ফাইলটি উপস্থিত ছিল না, যদিও এটি দেখতে এটির মতো দেখাচ্ছে। সমস্যাটি হ'ল উইন্ডোজ known "পরিচিত ফাইল ধরণের জন্য ফাইল এক্সটেনশনগুলি লুকান" তে কনফিগার করা হয়েছিল। এর অর্থ হ'ল যদি ফাইলটির নাম "ডেটা.টেক্সট" রয়েছে বলে মনে হয় তবে এর আসল ফাইলের নাম "ডেটা.টিএসটি.এসটিএক্সটি" হয়।

আশা করি এটি অন্যকে কিছু চুল বাঁচাতে সহায়তা করে।


আমি মনে করি না এটি আমার ক্ষেত্রে ইস্যু ছিল। আমার প্রশ্নের হিসাবে উল্লেখ করা হয়েছে: "আমি উইন্ডোতে" রান "উইন্ডোতে সম্পূর্ণ পাথটি অনুলিপি করতে পারি এবং ফাইলটি ভাল খুলে যায়" "যার অর্থ ফাইলটি আসলে বিদ্যমান exist
atsjoo

3

new Fileকমান্ড শুধু দেওয়া পাথ নাম ব্যবহার করে একটি ফাইলের একটি দৃষ্টান্ত সৃষ্টি করে। এটি আসলে হার্ড ড্রাইভে কোনও ফাইল তৈরি করে না।

যদি তুমি বল

File file = new File ("path");
file.exists() 

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

File file = new File ("path");
file.createNewFile();
file.exists();

এখন এই সত্য ফিরে আসবে।


ছোট ব্যাখ্যা: নতুন কীওয়ার্ড ব্যবহার করে কনস্ট্রাক্টরের প্রতিটি কলই একটি অবজেক্ট তৈরি করে - একই ক্ষেত্রে ক্লাস দ্বারা বর্ণিত একটি অবজেক্ট যার নাম ফাইল! সুতরাং ফাইলের উদাহরণ নয়! = বর্ণনাকারী :)
ceph3us

3

আপনি যদি প্রতিবার কোনও পদ্ধতিতে কল করার জন্য getAbsolveFile () কলগুলিতে ডিল করতে না চান, আপনি ইতিমধ্যে একটি পরম পথ দিয়ে নিজের ফাইলের দৃষ্টান্তটি আরও ভালভাবে তৈরি করুন। এই কৌতুক করতে হবে:

File file = new File("utilities/data/someTextFile.txt").getAbsoluteFile();

আমি এটি চেষ্টা করে একটি ব্লক, বিটিডাব্লু দিয়ে ঘিরে রাখার পরামর্শ দিই।


3

ইউআরএল / ইউআরআই স্থানীয় পথে রূপান্তর করার সময় সমস্যাটি উত্থাপিত হওয়ার ক্ষেত্রে সাধারণ সমস্যা তৈরি হয়।

Example: URL url = file:/D:/code%20repo%20sample/sample.txt

// To remove url reference
String localPath = url.getPath();  
> /D:/code%20repo%20sample/sample.txt

// Decoding reserved characters in url from hexadecimal to character
URLDecoder.decode(localPath, StandardCharsets.UTF_8.toString()); 
> /D:/code repo sample/sample.txt

আশাকরি এটা সাহায্য করবে.


0

সবাই ভাল সাড়া। আমি খুঁজে পেয়েছি এটি জাভা C:উইন্ডোজে মূল ডিরেক্টরিটি অ্যাক্সেস করতে সমস্যা বলে মনে হচ্ছে । অন্য যে কোন ডিরেক্টরি জরিমানা করা উচিত, কিন্তু কিছু কারণে, বিশেষভাবে উল্লেখ C:\বা C:বা C:/একটি ত্রুটি দিতে পারে। আমি এই জাতীয় সমস্যাটিকে new File("C:");নতুনভাবে উল্লেখ করে এবং এটির পরিবর্তে সমাধান করেছি File(System.getProperty("file.separator"));বা আপনার ফাইল ডিরেক্টরি হিসাবে "সি:" না বলে হার্ড কোড "\" করতে সক্ষম হওয়া উচিত এবং এটি কার্যকর হতে পারে। মার্জিত নয়, তবে এই প্রকল্পে আমার জন্য কাজটি করেছেন।

আমি আসা করি এটা সাহায্য করবে. সঠিক সমাধান হতে পারে না, তবে কমপক্ষে এটি আমার পক্ষে কাজ করেছিল। আমি আছি JRE 1.6, Win 7। চিয়ার্স!

শ্রদ্ধার সাথে,

@ Carpenter1010


0

যদি এটির ব্যর্থ হয় এমন পরিস্থিতিতে যদি এটি অন্য ব্যবহারকারী হিসাবে চালানো জড়িত থাকে এবং আপনি উইন্ডোজ ভিস্তা / উইন্ডোজ on এ থাকেন তবে এটি ভার্চুয়ালস্টোরের কারণে ঘটতে পারে, উইন্ডোজ একটি অপ্রতিযুক্ত ব্যবহারকারীকে সাধারণত "লিখতে" দেয় এমন জায়গাগুলি যেটি সাধারণত এটি করতে পারে না। পরিবর্তনগুলি তবে "% USERPROFILE% \ AppData \ স্থানীয় irt ভার্চুয়ালস্টোর in" এ সংরক্ষণ করা হয় যা প্রতিটি ব্যবহারকারীর অ্যাকাউন্টে ব্যক্তিগত।


4
আমি উইন্ডোজ এক্সপি x86 এ চলছে
জুলাই

0

যখন উপরের কিছুই আমার পক্ষে কাজ করেনি, তখন আমি চেষ্টা করেছিলাম

filePath = filePath.trim();

এটি কোনও অযাচিত চর্যাচটার থেকে আপনার স্ট্রিং পরিষ্কার করবে


-1

আমি ইদানীং এই একই বিষয়টি জুড়ে এসেছি। আমি যা করেছি তা হ'ল নেটবিনগুলি আনইনস্টল করা, সি ড্রাইভ থেকে নেটবিন ফোল্ডার মুছে ফেলা, প্রোগ্রাম ফাইলগুলি, আপডেট, প্রোগ্রাম ডেটা, কার্যত সর্বত্রই। তারপরে পুনরায় ইনস্টল করুন। এখন ভাল কাজ করছে। উপরের ক্রিয়াগুলি গ্রহণের আগে নেটবিয়ান প্রকল্প ফোল্ডারের ব্যাকআপ নিতে ভুলবেন না।

আশা করি এটা সাহায্য করবে.


-1

কিছু আইডিই (হতে পারে) এবং বা কিছু ওএস (উদা: উইন্ডো) সহ, ডিফল্টরূপে তাদের ফাইলে লেখার অ্যাক্সেস নেই। সুতরাং যদি আপনি file.exists () করার চেষ্টা করেন তবে এটি আপনাকে মিথ্যা দেখাচ্ছে। এটি ঠিক করতে, নীচের মত করুন

যদি ফাইলের জন্য আপনার রেফ পরিবর্তনশীল হয় তবে উদাহরণস্বরূপ: ফাইল এফ = নতুন ফাইল ("পথ");

সুতরাং এটি কাজ করার জন্য, মাউস দ্বারা চ নির্বাচন করুন এবং তারপরে অনুসন্ধান মেনু> অ্যাক্সেস লিখুন> ওয়ার্কস্পেসে যান। আশা করি এটি কার্যকর হবে।


-2

আমি মনে করি এর পরিবর্তে আপনার ব্যাকস্ল্যাশ ব্যবহার করা উচিত:

ফাইল ফাইল = নতুন ফাইল ("সি: \\ ব্যবহারকারী \\ ইউটিলিটিস \\ ডেটা \\ SomeTextFile.txt"); (দুটি ব্যাকস্ল্যাশ, একটি টাইপো নয়)

সমস্যার সমাধান করা উচিত :)


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