जब WatchService द्वारा निगरानी की गई निर्देशिका हटा दी जाती है, तो इसकी मूल निर्देशिका तुरंत फ़ाइल की listFiles विधि में हटाने को प्रतिबिंबित नहीं करती है और इसे हटाया नहीं जा सकता है। एक गैर खाली निर्देशिका ऐसा न करने को हटाने के लिएजावा घड़ी सेवा हटाए गए फ़ाइलों को फिर से बनाने के लिए प्रतीत होता है। क्या हो रहा है?
- recommended recursive solution: जब तक पूरी सेवा स्पष्ट रूप stopped है माता पिता के लिए परिणाम दिखाई देते हैं।
- deleteOnExit सामान्य समाप्ति पर नहीं किया जा रहा
- 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
हटाए जाने के बाद एक ब्रेकप्वाइंट डाल देख सकते हैं कि यह वास्तव में फाइल सिस्टम पर हटा दिया गया है। ब्रेकपॉइंट से शुरू होने से आखिरी विलोपन आगे बढ़ने का कारण बनता है, यह सुझाव देता है कि यह घड़ी सेवा धागे द्वारा किए गए परिवर्तनों की दृश्यता के साथ एक मुद्दा हो सकता है। क्या किसी को पता है कि यहां क्या हो रहा है, और यदि यह एक बग है? मैं वास्तव में क्या करने की कोशिश कर रहा हूं उन निर्देशिकाओं को हटाना है जिन पर निगरानी अन्य निर्देशिकाओं पर निगरानी को रोक दिए बिना निगरानी की जाती है, यह देखते हुए कि एपीआई द्वारा प्रदान की गई एक अनियंत्रित पथ विधि नहीं है जो इसे पूरा करने के अन्य मानक जावा तरीके हैं?
मुझे आश्चर्य है कि यह एक विंडोज़ केवल समस्या है – Pyrolistical
वही व्यवहार यहाँ। 'थ्रेड स्लीप (100);' को हटाने से पहले मुख्य में 'हटाएं (नई फ़ाइल (testDirName));' समस्या हल करती है - अजीब ... – assylias