File.exists () फ़ाइल मौजूद होने पर गलत देता है


90

मैं एक बग का सामना कर चुका हूं, मैं पीछे कोई तर्क नहीं ढूंढ सकता। मेरे पास यह फ़ाइल ऑब्जेक्ट है, जो इस तरह बनाया गया है:

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

मैं तब करता हूं file.exists(), और यह लौटता है false(!)। यदि फ़ाइल नहीं मिली है, तो मैं f.getAbsolutePath()एक फ़ाइल में प्रवेश कर रहा हूं । जब मैं रास्ते को देखता हूं, तो यह ठीक लगता है। मैं विंडोज में "रन" -विंडो में पूरा पथ कॉपी-पेस्ट कर सकता हूं और फ़ाइल ठीक खुलती है।

फ़ाइल हर समय मौजूद है और मेरे एप्लिकेशन के चलने के दौरान न तो डिलीट की गई है और न ही बदली गई है। यह स्थानीय मशीन पर स्थित है।

यह केवल कुछ स्थितियों में घटित होता है। मैं किसी भी समय गलती को पुन: उत्पन्न कर सकता हूं, लेकिन मुझे यकीन है कि फ़ाइल ऑब्जेक्ट का पथ उन कार्यों द्वारा नहीं बदला गया है जो मैं गलती को दोहराने के लिए करता हूं।

क्या कारण file.exists()झूठे हो सकते हैं ? क्या यह अनुमतियों या फ़ाइल लॉक आदि के साथ कुछ करना है?


तो, क्या फ़ाइल से पढ़ना संभव है भले ही मौजूद हो () गलत रिटर्न?
हैरी लाइम

हां, मैं फ़ाइल से पढ़ सकता हूं भले ही मौजूद हो () गलत है।
atsjoo

1
गलती को पुन: उत्पन्न करने के लिए वास्तव में क्या आवश्यक है?
user85421

1
यह एक एप्लिकेशन के अंदर होता है जो मैटलैब में लिखे फंक्शंस को कॉल करता है और जावा एप्लिकेशन में संकलित किया जाता है। यह मैटलैब फ़ंक्शंस की तरह लगता है जो "वर्तमान निर्देशिका" को बदल देता है जिससे समस्या प्रकट होती है। मैं फ़ाइल ऑब्जेक्ट बनाते समय निरपेक्ष पथ का उपयोग कर रहा हूं, इसलिए यह एक समस्या नहीं होनी चाहिए - हालांकि ऐसा लगता है। मैंने निश्चित रूप से फ़ाइल ऑब्जेक्ट के पूर्ण पथ को सत्यापित किया है, और यह सही है (जैसा कि यह पहले था कि मैटलैब फ़ंक्शन वर्तमान निर्देशिका को बदल देता है)।
atsjoo

7
क्या आप किसी दूरस्थ निर्देशिका (जैसे एनएफएस माउंट) के खिलाफ काम कर रहे हैं?
तोमर गेबल

जवाबों:


42

मैं विंडोज 7 पर निम्न स्थिति देख रहा हूं:

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

प्रश्न में फ़ाइल "var \ log" है, निरपेक्ष पथ एक मौजूदा फ़ाइल को संदर्भित करता है जो एक सामान्य उपनिर्देशिका (वर्चुअल कैमरा नहीं) में है। इसे IDE से देखा जाता है।


16
मैंने अभी यह पता लगाया है: Bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4483097 जाहिरा तौर पर, फ़ाइल पर चल रहे संचालन को वर्तमान निर्देशिका के विरुद्ध हल किया गया है, जबकि AbsolutePath user.dir के विरुद्ध हल करता है। यदि ये दो रास्ते मेल नहीं खाते हैं, तो आपको परस्पर विरोधी परिणाम मिलते हैं। शैतानी!
रोमन ज़ेका जूल

3
मेरे पास एक ही समस्या है मैंने फ़ाइल की मौजूदगी की जाँच करने के लिए दोनों विधियों का उपयोग करने की कोशिश की, और फिर भी मैं केवल विंडोज 7 पर गलत हूं! कोई उपाय?
देजेल

@ ओडली: आप किस आईडीई का उपयोग कर रहे हैं? आपका -Duser.dir किस पर सेट है? मेरी समस्या सेटिंग के कारण थी -Duser.dir वर्तमान काम करने वाले की तुलना में एक अलग निर्देशिका में।
रोमन ज़ेनका

1
कोई भी व्यक्ति जो डायनेमिक वेब प्रोजेक्ट पर काम कर रहा है, file.exists () का उपयोग करके एक अपवाद को फेंक देगा, WEB-INF निर्देशिका में फ़ाइलों की जांच करने के लिए file.getAbsoluteFile ()। )।
पीएस

इस उत्तर और टिप्पणियों के लिए एक अलग क्यूए बनाने पर विचार करें
बटो-बैर त्सरेनोव

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क्योंकि पथ URL नहीं है, लेकिन यह एक पूर्ण पथ है।

स्प्रिंग फ्रेमवर्क के साथ जो वास्तव में ResourceUtils.getFile(filename)करता है - जहां नाम URL या पूर्ण फ़ाइल पथ हो सकता है।


5
मुझे file:/C:/DEV/test.txtपथनाम के रूप में काम करने की उम्मीद नहीं होगी । यह एक URL है जो पथनाम नहीं है। जबकि कुछ लोग यह गलती करते हैं, इस बात का कोई सबूत नहीं है कि ओपी के पास ...
स्टीफन सी

15

यदि प्रक्रिया में यह बताने की अनुमति नहीं है कि क्या कोई फ़ाइल मौजूद है, तो वह झूठी हो जाएगी। किसी फ़ाइल को खोलना संभव हो सकता है, लेकिन मौजूद होने पर सामान्य तरीकों से न बताएं।


20
दिलचस्प। क्या आपके द्वारा इसे विस्तार दिया जा सकता है? आपके पास कौन सी विशिष्ट अनुमतियाँ हैं?
क्लेमेंट

यहां java.nio.file.AccessDeniedException फ़ाइल / dir अस्तित्व तक पहुंचने की अवरोधन क्षमता हो सकती है। उदाहरण के लिए, यदि आप एफएआर या अन्य फाइल एक्सप्लोरर में खोले हुए को रखते हैं, तो सभी नेस्टेड फाइलों के साथ डीआईआर को हटा दें और इस डीआईआर के अस्तित्व की जांच करें, तो आप आपके लिए रखी गई अस्थायी फाइल के लिए एक्सेसडेनइसेप्शन (आईओएक्स अपवाद) को प्राप्त कर सकते हैं। इस स्थिति में I.Exception के लिए Files.exists गलत है।
बेलुहा

11

उपरोक्त उत्तर मेरे मामले में मदद नहीं करते थे। जैसा कि ऊपर कहा गया है, मेरे पास था:

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

इसका मूल कारण यह था कि विंडोज 7 मशीन के मालिक ने सीएमडी के लिए रजिस्ट्री को संशोधित किया था, ताकि यह पायथन के साथ काम करने के लिए एक विशिष्ट निर्देशिका में लॉन्च करने के लिए एक कमांड को स्वचालित करेगा। इस संशोधन ने जावा 1.6 कोड को अपंग कर दिया जो स्पष्ट रूप से कुछ फ़ाइल संचालन के लिए विंडोज पर सीएमडी का उपयोग करता है , जैसे । रजिस्ट्री से ऑटोरन को खत्म करने से समस्या हल हो गई।exists()


1
3.5 साल बाद, और मैं एक ही मुद्दे में भाग गया। हर बार जब मैंने cmd.com लॉन्च किया, तो मेरे पास पर्यावरण चर को कॉन्फ़िगर करने के लिए एक ऑटोरन स्क्रिप्ट थी। इसने वर्तमान निर्देशिका को भी नहीं बदला - बस कुछ डॉस मैक्रो और कुछ पर्यावरण चर। मैंने ऑटोरन को हटा दिया, और बस मैन्युअल रूप से फ़ाइल में कमांड चलाए, और अचानक File.exists () सही ढंग से काम करता है।
होमर राशिदासी

1
OMG, यह वास्तव में काम करता है (उन दोनों को), मैं सिर्फ गलत फाइल की जांच कर रहा था और इस सवाल पर आया कि उनमें से कोई भी मेरे लिए काम क्यों नहीं करता है :) BTW, ऐसा लगता ()है कि दूसरी पंक्ति में गायब हैं exists; )
RAM237

3

स्पष्ट रूप से कई संभावित कारण हैं और पिछले उत्तर उन्हें अच्छी तरह से प्रलेखित करते हैं, लेकिन यहां मैंने एक विशेष मामले में इसे कैसे हल किया:

मेरे एक छात्र को यह समस्या थी और मैंने लगभग अपने बालों को बाहर निकालने की कोशिश की। यह पता चला कि फ़ाइल मौजूद नहीं थी, भले ही यह ऐसा दिखता था जैसे यह किया था। समस्या यह थी कि विंडोज 7 को "ज्ञात फ़ाइल प्रकारों के लिए फ़ाइल एक्सटेंशन छिपाएं" के लिए कॉन्फ़िगर किया गया था। इसका अर्थ है कि यदि फ़ाइल में "data.txt" नाम है तो इसका वास्तविक नाम "data.txt.txt" है।

आशा है कि यह दूसरों को अपने आप को कुछ बाल बचाने में मदद करता है।


मुझे नहीं लगता कि यह मेरे मामले में मुद्दा था। जैसा कि मेरे प्रश्न में उल्लेख किया गया है: "मैं विंडोज में" रन "-विंडो में संपूर्ण पथ को कॉपी-पेस्ट कर सकता हूं और फ़ाइल ठीक खुलती है।", जिसका अर्थ है कि फ़ाइल वास्तव में मौजूद है।
एटूजेडू

3

new Fileआदेश सिर्फ दिए गए पथ नाम का उपयोग कर एक फ़ाइल का एक उदाहरण बनाता है। यह वास्तव में हार्ड ड्राइव पर एक फ़ाइल नहीं बनाता है।

अगर आप कहते हैं

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

यह तभी सही हो सकता है जब उसी पथ के साथ कोई मौजूदा फ़ाइल थी। यदि आप पहली पंक्ति में घोषित उसी फ़ाइल की जाँच करना चाहते हैं, तो आपको इसे इस तरह उपयोग करने की आवश्यकता हो सकती है।

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

अब यह सच हो जाएगा।


छोटी व्याख्या: नए कीवर्ड के उपयोग से कंस्ट्रक्टर को हर कॉल एक ऑब्जेक्ट बनाता है - जैसे कि इस मामले में क्लास द्वारा बताई गई एक वस्तु जिसका नाम फ़ाइल है! तो फ़ाइल का एक उदाहरण नहीं! = वर्णनकर्ता :)
ceph3us

3

यदि आप getAbsoluteFile () को कॉल करने के लिए हर बार कॉल नहीं करना चाहते हैं, तो आप बेहतर तरीके से पहले से ही एक पूर्ण पथ के साथ अपनी फ़ाइल आवृत्ति बनाते हैं। यह काम कर जाना चाहिए:

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

मैं इसे एक कोशिश-पकड़ ब्लॉक, BTW के साथ घेरने का सुझाव देता हूं।


3

URL / URI को स्थानीय पथों में परिवर्तित करते समय समस्या को सामान्य करने के लिए।

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

उम्मीद है की यह मदद करेगा।


2

जब ["ज्ञात फ़ाइल प्रकारों के लिए एक्सटेंशन छिपाएं।"] विंडोज़ की जाँच की जाती है तो "t.txt.txt" खोलें जब [एक्सप्लोरर] में "t.txt" टाइप करें / [विंडोज़ चलाएँ] लेकिन प्रोग्रामेटिक रूप से नहीं।


1
मेरे पास यह मुद्दा था, और समस्या यह थी कि मैंने एक txt फ़ाइल बनाई थी, जिसे C: टेस्ट में 'testFile.txt' कहा जाता था। मैंने इस फ़ाइल को पथ C: \ test \ testFile.txt का उपयोग करके संदर्भित किया, जो काम नहीं किया। ऐसा इसलिए था क्योंकि फ़ाइल को वास्तव में testFile.txt.txt के रूप में सहेजा गया था, इसलिए उपरोक्त समाधान पर पुराना वोट (पुराना सवाल है, लेकिन कोई स्वीकृत उत्तर नहीं!)
Theblacknight

भगवान विंडोज इतना बेकार है।
Aafc

0

सभी को अच्छी प्रतिक्रियाएं। मैंने पाया है कि यह C:विंडोज़ पर रूट डायरेक्टरी को जावा तक पहुँचने में एक समस्या है । किसी भी अन्य निर्देशिका ठीक होना चाहिए, लेकिन किसी कारण से, विशेष रूप से उल्लेख C:\या C:या C:/एक त्रुटि दे सकता है। मैंने इस समान समस्या को हल करने का उल्लेख किया है new File("C:");और इसे नए के साथ बदल दिया है File(System.getProperty("file.separator"));या आपको अपनी फ़ाइल निर्देशिका के रूप में "c:" कहने के बजाय हार्ड कोड "\" में सक्षम होना चाहिए और यह काम कर सकता है। सुरुचिपूर्ण नहीं, लेकिन इस परियोजना पर मेरे लिए काम किया गया।

मुझे उम्मीद है यह मदद करेगा। सही समाधान नहीं हो सकता है, लेकिन कम से कम यह मेरे लिए काम करता है। मैं चालू हूं JRE 1.6, Win 7। चीयर्स!

सम्मान से,

@ Carpenter1010


0

यदि ऐसी स्थितियाँ जहाँ यह विफल हो जाती है, तो इसे किसी अन्य उपयोगकर्ता के रूप में चलाना शामिल है, और आप Windows Vista / Windows 7 पर हैं, यह VirtualStore के कारण हो सकता है, वह तंत्र जहाँ Windows एक अप्रभावित उपयोगकर्ता को "लिखने" देता है, इसे सामान्य रूप से नहीं रखा जा सकता है। परिवर्तनों को हालांकि "% USERPROFILE% \ AppData \ Local \ VirtualStore \" में संग्रहीत किया जाता है जो प्रत्येक उपयोगकर्ता खाते के लिए निजी हैं।


1
मैं विंडोज़ पर चल रहा हूँ xp x86
atsjoo

0

जब ऊपर से कुछ भी मेरे लिए काम नहीं किया, तो मैंने कोशिश की

filePath = filePath.trim();

यह आपके स्ट्रिंग को किसी भी अवांछित चरखे से साफ करेगा


0

मैं हाल ही में इसी मुद्दे पर आया था। क्या किया था Netbeans, C ड्राइव, प्रोग्राम फाइल्स, अपडेट, प्रोग्रामडेटा से वस्तुतः हर जगह नेटबीन्स को डिलीट करने के लिए। फिर पुनर्स्थापित करें। अब ठीक काम कर रहा है। ऊपर कार्रवाई करने से पहले netbeans प्रोजेक्ट फ़ोल्डर का बैकअप लेना न भूलें।

आशा करता हूँ की ये काम करेगा।


0

कुछ IDE (हो सकता है) और या कुछ OS (उदा: विंडो) के साथ, डिफ़ॉल्ट रूप से उनके पास फाइलों पर लिखने की पहुंच नहीं है। इसलिए यदि आप file.exists करने की कोशिश करते हैं (तो) यह आपको झूठा दिखाएगा। इसे ठीक करने के लिए, नीचे की तरह करें

अगर फ़ाइल के लिए आपका रेफरी चर f, उदाहरण के लिए: फ़ाइल f = नई फ़ाइल ("पथ");

तो यह काम करने के लिए, माउस से च का चयन करें और फिर खोज मेनू> पहुंच लिखें> कार्यक्षेत्र पर जाएं। उम्मीद है कि यह काम करेगा।


-2

मुझे लगता है कि आपको इसके बजाय बैकस्लैश का उपयोग करना चाहिए:

फ़ाइल फ़ाइल = नई फ़ाइल ("C: \\ उपयोगकर्ता \\ उपयोगिताओं \\ डेटा \\ someTextFile.txt"); (दो बैकस्लैश, टाइपो नहीं)

समस्या को हल करना चाहिए :)


3
मुझे लगता है कि यह मुद्दा निरपेक्ष पथ बनाम सापेक्ष पथ से अधिक संबंधित है। स्लैश जावा में विंडोज पथ के लिए भी मान्य हैं।
рüффп
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.