2012-09-07 39 views
6

जब WatchService द्वारा निगरानी की गई निर्देशिका हटा दी जाती है, तो इसकी मूल निर्देशिका तुरंत फ़ाइल की listFiles विधि में हटाने को प्रतिबिंबित नहीं करती है और इसे हटाया नहीं जा सकता है। एक गैर खाली निर्देशिका ऐसा न करने को हटाने के लिएजावा घड़ी सेवा हटाए गए फ़ाइलों को फिर से बनाने के लिए प्रतीत होता है। क्या हो रहा है?

  1. recommended recursive solution: जब तक पूरी सेवा स्पष्ट रूप stopped है माता पिता के लिए परिणाम दिखाई देते हैं।
  2. deleteOnExit सामान्य समाप्ति पर नहीं किया जा रहा
  3. delete पर झूठ लौट रहा है और फाइल सिस्टम पर कोई प्रभाव नहीं पड़ता है।

प्रदर्शित करने के लिए, इस परीक्षण कोड:

import java.io.*; 
import java.nio.file.*; 

class DirectoryTester { 
    static WatchService watcher; 
    static { 
    try{watcher = FileSystems.getDefault().newWatchService();} 
    catch (IOException e) {e.printStackTrace();} 
    } 

    public static void main(String[] args) throws IOException { 
    String SEPARATE = System.getProperty("file.separator"); 
    String testDirName = System.getProperty("user.dir") + SEPARATE + "testDir"; 
    String subDirName = testDirName + SEPARATE + "subDir"; 
    String fileName = subDirName + SEPARATE +"aFile"; 
    create(fileName); 
    Paths.get(subDirName).register(watcher, StandardWatchEventKinds.ENTRY_DELETE); 
    delete(new File(testDirName)); 
    } 

    static void create(String nameOfFile) throws IOException { 
    new File(nameOfFile).getParentFile().mkdirs(); 
    Files.createFile(Paths.get(nameOfFile)); 
    System.out.println("Created " + nameOfFile); 
    }  

    static void delete(File toDelete) throws IOException { 
    if (toDelete.isDirectory()) 
     for (File c : toDelete.listFiles()) 
     delete(c); 
    int numContainedFiles = toDelete.listFiles() != null ? toDelete.listFiles().length : 0; 
    if (!toDelete.delete()) { 
     System.out.println("Failed to delete " + toDelete + " containing " + numContainedFiles); 
    } 
    else { 
     System.out.println("Deleted " + toDelete + " containing " + numContainedFiles); 
    } 
    } 
} 

खिड़कियों पर निम्न उत्पादन, जिसके साथ testDir फाइल सिस्टम से हटाया नहीं जा रहा है मेल खाती है देता है।

Created C:\Dropbox\CodeSpace\JavaTestbed\src\testDir\subDir\aFile 
Deleted C:\Dropbox\CodeSpace\JavaTestbed\src\testDir\subDir\aFile containing 0 
Deleted C:\Dropbox\CodeSpace\JavaTestbed\src\testDir\subDir containing 0 
Failed to delete C:\Dropbox\CodeSpace\JavaTestbed\src\testDir containing 1 

मैं अगर मैं subDir हटाए जाने के बाद एक ब्रेकप्वाइंट डाल देख सकते हैं कि यह वास्तव में फाइल सिस्टम पर हटा दिया गया है। ब्रेकपॉइंट से शुरू होने से आखिरी विलोपन आगे बढ़ने का कारण बनता है, यह सुझाव देता है कि यह घड़ी सेवा धागे द्वारा किए गए परिवर्तनों की दृश्यता के साथ एक मुद्दा हो सकता है। क्या किसी को पता है कि यहां क्या हो रहा है, और यदि यह एक बग है? मैं वास्तव में क्या करने की कोशिश कर रहा हूं उन निर्देशिकाओं को हटाना है जिन पर निगरानी अन्य निर्देशिकाओं पर निगरानी को रोक दिए बिना निगरानी की जाती है, यह देखते हुए कि एपीआई द्वारा प्रदान की गई एक अनियंत्रित पथ विधि नहीं है जो इसे पूरा करने के अन्य मानक जावा तरीके हैं?

+0

मुझे आश्चर्य है कि यह एक विंडोज़ केवल समस्या है – Pyrolistical

+1

वही व्यवहार यहाँ। 'थ्रेड स्लीप (100);' को हटाने से पहले मुख्य में 'हटाएं (नई फ़ाइल (testDirName));' समस्या हल करती है - अजीब ... – assylias

उत्तर

7

संभवतः संबंधित:

http://bugs.sun.com/view_bug.do?bug_id=6972833

WatchService प्रत्येक देखा निर्देशिका के लिए एक खुला संभाल है। यदि कोई घड़ी निर्देशिका हटा दी जाती है तो WatchService हैंडल को बंद कर देता है ताकि निर्देशिका प्रविष्टि को मूल निर्देशिका से हटाया जा सके। यूटिलिटीज और एप्लिकेशन के लिए एक समस्या उत्पन्न होती है जो तुरंत माता-पिता निर्देशिका को हटाने में सक्षम होने की उम्मीद करता है क्योंकि यह अधिसूचना प्राप्त करने और हैंडल को बंद करने के लिए घड़ी सेवा के लिए कुछ मिलीसेकंड ले सकता है। अगर उस समय के दौरान उपकरण मूल निर्देशिका को हटाने का प्रयास करता है तो यह असफल हो जाएगा। इस समय हमारे पास इस मुद्दे का समाधान नहीं है।

+0

+1 बिल्कुल ठीक लगता है। – assylias

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