2009-11-13 24 views
33
File file = new File(path); 
if (!file.delete()) 
{ 
    throw new IOException(
     "Failed to delete the file because: " + 
     getReasonForFileDeletionFailureInPlainEnglish(file)); 
} 

वहाँ पहले से ही वहाँ बाहर getReasonForFileDeletionFailureInPlainEnglish(file) का एक अच्छा कार्यान्वयन है? अन्यथा मुझे इसे खुद लिखना होगा।कैसे बताएं कि जावा में फ़ाइल हटाना क्यों विफल रहता है?

उत्तर

-1

रूप File.delete()

में बताया आप एक SecurityManager है कि आप के लिए exeception फेंकता का उपयोग कर सकते हैं।

3

एक हटाए जाने की वजह से एक या अधिक कारणों विफल हो सकता है:

  1. फ़ाइल मौजूद नहीं है (File#exists() का उपयोग परीक्षण करने के लिए)।
  2. फ़ाइल अवरोधित किया गया है (क्योंकि यह किसी अन्य अनुप्रयोग (या अपने स्वयं कोड द्वारा खोला जाता है!)।
  3. आप अधिकृत नहीं हैं (लेकिन यह एक SecurityException, झूठी नहीं लौटे फेंक दिया होता!)।

इसलिए जब भी विलोपन विफल हो जाता है, तो यह जांचने के लिए File#exists() करें कि यह 1) या 2 के कारण है)।

संक्षिप्त:

if (!file.delete()) { 
    String message = file.exists() ? "is in use by another app" : "does not exist"; 
    throw new IOException("Cannot delete file, because file " + message + "."); 
} 
+0

@BalusC, याद रखें कि file.exists() भी एक SecurityException फेंक कर सकते हैं। –

+0

फ़ाइल सिस्टम अनुमतियों के कारण डिलीट विफल होने पर आपको सुरक्षा अपवाद नहीं मिलेगा। – Thilo

+0

यदि आपका JVM प्रतिबंधित रूप से कॉन्फ़िगर किया गया है, तो आपको केवल सुरक्षा अपवाद प्राप्त होगा, उदाहरण के लिए यदि आप एक एप्लेट हैं। यहां एक "सामान्य" एप्लिकेशन सैंडबॉक्स नहीं किया जाएगा। – Thilo

20

हम्म, सबसे अच्छा मैं कर सकता:

public String getReasonForFileDeletionFailureInPlainEnglish(File file) { 
    try { 
     if (!file.exists()) 
      return "It doesn't exist in the first place."; 
     else if (file.isDirectory() && file.list().length > 0) 
      return "It's a directory and it's not empty."; 
     else 
      return "Somebody else has it open, we don't have write permissions, or somebody stole my disk."; 
    } catch (SecurityException e) { 
     return "We're sandboxed and don't have filesystem access."; 
    } 
} 
+0

@Cory, file.exists(), isDirectory() और list() सभी सुरक्षा निष्पादन फेंक सकते हैं। –

+0

@ बॉब: यह केवल एक सैंडबॉक्स में होता है। और मूल डिलीट() ने भी सुरक्षा अपवाद को फेंक दिया होगा।लेकिन पूर्णता के लिए, मुझे लगता है कि उसे इसे पकड़ना चाहिए (और "सैंडबॉक्स किया गया: कोई फाइल सिस्टम एक्सेस नहीं") – Thilo

+0

@ थिलो ने कहा, लेकिन हाँ, मैं पूछताछ के सवाल को संबोधित कर रहा था, फ़ाइल I/O में शामिल होने पर हर दूसरी संभावना नहीं। :) –

21

जावा 6 में, वहाँ दुर्भाग्य से निर्धारित करने के लिए क्यों एक फ़ाइल हटाया नहीं जा सकता कोई रास्ता नहीं है। जावा 7 के साथ, आप java.nio.file.Path#delete() का उपयोग कर सकते हैं, जो आपको विफलता का विस्तृत कारण देगा, अगर फ़ाइल या निर्देशिका को हटाया नहीं जा सकता है।

ध्यान दें कि file.list() निर्देशिकाओं के लिए प्रविष्टियां लौटा सकता है, जिसे हटाया जा सकता है। हटाने के लिए एपीआई दस्तावेज कहता है कि केवल खाली निर्देशिका हटा दी जा सकती है, लेकिन एक निर्देशिका को खाली माना जाता है, यदि निहित फाइलें हैं उदा। ओएस विशिष्ट मेटाडेटा फाइलें।

+7

यह डिलीट विधि जावा 7 एपीआई में मौजूद नहीं प्रतीत होती है। [लिंक] (http://download.oracle.com/javase/7/docs/api/java/nio/file/Path.html) संपादित करें: अभी पाया गया है कि यह अब फाइल वर्ग में है। [लिंक] (http://download.oracle.com/javase/7/docs/api/java/nio/file/Files.html) – RishiD

+0

क्या यह फेंक देता है जब _a file_ को हटाने में विफल रहता है? वापसी का प्रकार शून्य है! इसके दस्तावेज़ अस्पष्ट हैं। यहां पूछा गया: http://stackoverflow.com/questions/19935624/java-nio-file-files-deletepath-path-void-return-type –

6

ध्यान रखें कि यह आपका स्वयं का एप्लिकेशन हो सकता है जो किसी फ़ाइल को हटाए जाने से रोकता है!

आपने पहले फाइल करने के लिए लिखा था और लेखक बंद नहीं किया, तो आप फ़ाइल अपने आप को ताला लगा रहे हैं।

+2

जावा 6 का उपयोग करते हुए विंडोज 7 पर परीक्षण करते समय मुझे यह समस्या एक पाठक के साथ भी थी । मैंने पाठक को बंद करने से पहले फ़ाइल को हटाने का प्रयास किया और यह असफल रहा। – Doppelganger

4

जावा 7 java.nio.file.Files वर्ग का भी इस्तेमाल किया जा सकता है:

http://docs.oracle.com/javase/tutorial/essential/io/delete.html

try { 
    Files.delete(path); 
} catch (NoSuchFileException x) { 
    System.err.format("%s: no such" + " file or directory%n", path); 
} catch (DirectoryNotEmptyException x) { 
    System.err.format("%s not empty%n", path); 
} catch (IOException x) { 
    // File permission problems are caught here. 
    System.err.println(x); 
}