2012-08-30 13 views
27

क्यों file.mkdir झूठी लौट रहा है?File.mkdir या mkdirs झूठी वापसी - कारण?

Google इंगित करता है कि कई कारण हो सकते हैं (जैसे सुरक्षा, अनुमतियां, पथनाम, आदि)।

मेरे सवालों का:

  1. कैसे झूठे लौटने का सही कारण पता लगाने के लिए?
  2. यदि सुरक्षा/अनुमतियां एक कारण हैं, तो सुरक्षा अपवाद क्यों नहीं फेंक दिया जाता है?

उत्तर

16

सुरक्षा/अनुमतियाँ एक कारण है, तो क्यों SecurityException फेंक नहीं है (जो जावाडोक में बताया गया है)?

एक SecurityException आप कुछ, नहीं ओएस-स्तर

कि गलत लौटने का कारण है कि सही कारण पता लगाने के लिए एक रास्ता है करने के लिए JVM स्तरीय अनुमति नहीं है जब फेंक दिया जाता है?

नहीं, AFAIK। जानने का एकमात्र तरीका निर्देशिका पर अनुमतियों को जांचना होगा, सुनिश्चित करें कि यह उन्हें कॉल करने से पहले मौजूद नहीं है, जांचें कि क्या मूल निर्देशिका मौजूद है, आदि।

हालांकि, यदि आप जावा 7 का उपयोग कर रहे हैं या उच्च, आप निर्देशिका बनाने के लिए एनआईओ का उपयोग कर सकते हैं। विशेष रूप से, Files.createDirectory:

File dir = new File("mydir"); 
Files.createDirectory(dir.toPath()); 

आप पूरी तरह से java.io.File उपयोग करने के साथ NIO का उपयोग करना चाहते हैं, तो आप Paths.get एक Path बजाय बनाने के लिए उपयोग कर सकते हैं:

Path dir = Paths.get("mydir"); 
Files.createDirectory(dir); 

दोनों ही मामलों में, अगर निर्देशिका नहीं किया जा सकता बनाया गया, यह एक IOException फेंक देगा क्योंकि ऑपरेशन विफल क्यों हुआ।

Files में अधिकांश विधियों के लिए यह सच है, और इसलिए इसका उपयोग File कक्षा में विधियों का उपयोग करने के लिए किया जाता है।

+1

"mkdir" के साथ, यदि आप mkdir ("/ path1/path2 /") की कोशिश कर रहे हैं; और पथ 1 (पैरेंट) फ़ोल्डर कमांड निष्पादित करने से पहले अस्तित्व में नहीं था, mkdir विफल हो जाएगा, यह केवल एक मौजूदा फ़ोल्डर के अंदर एक नया फ़ोल्डर बना सकता है, mkdirs सभी फ़ोल्डर्स - पथ 1 और पथ 2 बना सकते हैं। मुझे mkdirs की विफलता के साथ कोई सुराग नहीं है। उम्मीद है कि यह – Andiana

+0

@Andiana सही मदद करें। ऐसा इसलिए है क्योंकि जावा की 'File.mkdir' विंडोज सम्मेलनों के बजाय लिनक्स सम्मेलनों का पालन करती है, और यह मध्यवर्ती निर्देशिका नहीं बनाती है। 'File.mkdirs' विंडोज सम्मेलनों का पालन करता है, और यह लिनक्स में' mkdir --parents' जैसा व्यवहार करता है। अच्छी बात। फिर भी, सटीक कारण प्राप्त करने के लिए, नीचे माइकल का उत्तर सबसे अच्छा है: जावा के एनआईओ पैकेज का उपयोग करें। – Brian

8
  1. नहीं, जावा के भीतर से कम से कम नहीं सटीक कारण mkdirs() रिटर्न झूठी लगाने के लिए कोई रास्ता नहीं है, के रूप में यह शायद ओएस निर्भर होगा। अगर वहाँ SecurityManager के checkRead() और checkWrite() तरीकों में एक सुरक्षा उल्लंघन है

  2. एक SecurityException फेंक दिया है। ओएस अनुमतियाँ समस्या होने पर अपवाद नहीं फेंक दिया जाता है।


साथ ही, ध्यान दें कि यदि आप File.mkdir() कहते हैं, और मूल निर्देशिका मौजूद नहीं है, mkdir() अवास्तविक लौटाते हैं। हालांकि, File.mkdirs() पर कॉल करने से गैर-मौजूद मूल निर्देशिकाएं बन जाएंगी।

38

mkdir और mkdirs पहले से मौजूद होने पर झूठी वापसी करते हैं, इसलिए विफलता का एक कारण हो सकता है।

यदि आप जावा 7 का उपयोग कर रहे हैं, तो आप फाइल क्लास का उपयोग कर सकते हैं। यह बहुत अच्छे विवरण के साथ त्रुटि पर IOException फेंकता है।

Files.createDirectory(file.toPath()); 
+6

यह निर्देशिका गलत है अगर निर्देशिका पहले से मौजूद है या निर्देशिका बनाने में कोई त्रुटि हुई है। अब उपयोगी एपीआई का एक टुकड़ा है। –