2011-11-13 4 views
7

मैं परिवर्तन के लिए निर्देशिका देखने के लिए Java7 की नई सुविधा का उपयोग कर रहा (http://download.oracle.com/javase/tutorial/essential/io/notification.html के रूप में यह निम्नलिखित ट्यूटोरियल में वर्णित है) हो जाता है।जावा एनओओ फाइल सिस्टम सिस्टम वॉचर निर्देशिका निर्देशिका।</p> <p>देख ही काम करता है (लगभग) समस्याओं के बिना: विलोपन असंभव

कम या ज्यादा मेरे पास दो मुद्दे हैं और मुझे आशा है कि आप में से कुछ को यह पता चल जाएगा कि इसे कैसे संभाला जाए।

  1. फ़ोल्डर को देखने के बाद जोड़ा गया है, वीएम के पास इसका उपयोग है और यह इसे जारी नहीं करता है। यह इतना बड़ा मुद्दा नहीं होना चाहिए। लेकिन यदि आप किसी अन्य निर्देशिका में निर्देशिका बना रहे हैं और इस में एक और। (उदाहरण के लिए आप निर्देशिका c:\tmp\a निर्देशिका b में बना सकते हैं और b निर्देशिका c (c:\tmp\a\b\c) में) यह b और c को वीएम की पहुँच की वजह से, निर्देशिका a नष्ट करने के लिए संभव नहीं है। यदि आप सभी फ़ोल्डरों को हटाना चाहते हैं (उदा।, आपके विंडोज एक्सप्लोरर के साथ) आपको c पहले, b और फिर a हटा देना होगा। यह अजीब बात है, लेकिन इस तरह से काम करता है (हालांकि असुविधाजनक है)

  2. यह समस्या पहले के परिणामस्वरूप प्रतीत होती है। यदि a में कई बदलाव कभी-कभी होते हैं (अधिक या कम) मुझे एक अपवाद मिलता है जो मुझे बताता है, नव निर्मित फ़ोल्डर का उपयोग दूसरी प्रक्रिया द्वारा किया जाता है और इसे एक्सेस करना संभव नहीं है। यह अजीब बात है, क्योंकि मुझे लगता है कि यह अधिसूचना प्राप्त करने के लिए कोई फर्क नहीं पड़ता। और क्योंकि यह बिल्कुल अपवाद नहीं है जब यह बिल्कुल अपवाद फेंक दिया जाता है।

आप इसका अंदाज़ा लगा यह संभव लॉक नहीं करने के लिए या कम से कम उपयोगकर्ता शास्त्रीय सुविधाजनक तरीके से इस तरह के एक निर्देशिका संरचना को नष्ट करने की क्षमता देने के लिए बनाने के लिए है?

उत्तर

1

खैर मैं कोड लिंक आप पोस्ट में प्रदर्शित की कोशिश की है, समान चीज़ें पसंद करने की कोशिश कर रहे कर:

मेरी C: \ एक dir \ अस्थायी: \ अस्थायी निर्देशिका मैं प्रोग्राम के एसी बनाने और फिर एसी: \ अस्थायी \ एक \ b निर्देशिका:

File startDir = new File("c:\temp"); 
     if(!startDir.exists()) { 
      startDir.mkdir(); 
     } 
     File aDir = new File("c:\\temp\\a"); 
     File bDir = new File("c:\\temp\\a\\b"); 
     if(!aDir.exists()) { 
      aDir.mkdir(); 
     } 
     if(!bDir.exists()) { 
      bDir.mkdir(); 
     } 

तो मैं "एक" और "बी" निर्देशिका के लिए पर नजर रखने वालों जोड़ें:

public static void watch(final File dir,final WatchService watcher) { 
     Path path = dir.toPath(); 
     try { 
      final WatchKey bDirWatchKey = path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY); 
      new Thread(new Runnable() { 
       public void run() { 
        System.out.println("Watching: "+dir.getName()); 
        while(true) { 
         try {Thread.sleep(1000);} catch (InterruptedException e) {} 
         List<WatchEvent<?>> events = bDirWatchKey.pollEvents(); 
         for(WatchEvent<?> event:events) { 
          System.out.println(dir.getName()+" event: #"+event.count()+","+event.kind()+" File="+event.context()); 
         } 
        }     
       } 
      }).start(); 
     } catch (IOException x) { 
      x.printStackTrace(); 
     } 
    } 

यह ठीक काम करता है, अगर मैं में फ़ाइलों को संशोधित "ए" या "बी" मुझे इसी तरह के कॉन्स मिलते हैं ले उत्पादन

यह सच है कि विंडोज एक्सप्लोरर (विंडोएक्स एक्सपी मशीन पर) के साथ मैं एक देखी गई निर्देशिका को हटा नहीं सकता (यह मुझे बताता है कि मेरे पास एक्सेस अधिकार नहीं हैं)। हालांकि मैं इसे कुल कमांडर जैसे अन्य उपकरणों के साथ हटा सकता हूं। मैं तब भी rd c:\temp\a\b के साथ विंडोज कमांड लाइन से हटा सकता हूं। मुझे लगता है कि जावा के साथ विंडोज एक्सप्लोरर के साथ यह एक मुद्दा है ...

-1

आपकी दूसरी समस्या के संबंध में, यदि आपको अपवाद मिल रहा है "नया बनाया गया फ़ोल्डर किसी अन्य प्रक्रिया द्वारा उपयोग किया जाता है और यह संभव नहीं है इस तक पहुंचें"। आप अपने कोड में परमाणु संचालन का उपयोग करने का प्रयास कर सकते हैं। यह संचालन को बाधित नहीं करने में मदद करेगा और आपकी समस्या का समाधान कर सकता है।

संबंधित मुद्दे