Recursive delete unit test based on users@ query - working fine already

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1772894 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2016-12-06 13:52:46 +00:00
parent 83ff0e5ec4
commit 30d64fda8c

View File

@ -34,6 +34,7 @@ import org.apache.poi.hpsf.PropertySet;
import org.apache.poi.hpsf.PropertySetFactory;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.poifs.common.POIFSConstants;
import org.apache.poi.poifs.property.DirectoryProperty;
import org.apache.poi.poifs.property.NPropertyTable;
import org.apache.poi.poifs.property.Property;
import org.apache.poi.poifs.property.RootProperty;
@ -1483,4 +1484,58 @@ public final class TestNPOIFSFileSystem {
assertThat(wbDataExp, equalTo(wbDataAct));
}
/**
* Ensure that you can recursively delete directories and their
* contents
*/
@Test
public void RecursiveDelete() throws Exception {
File testFile = POIDataSamples.getSpreadSheetInstance().getFile("SimpleMacro.xls");
NPOIFSFileSystem src = new NPOIFSFileSystem(testFile);
// Starts out with 5 entries:
// _VBA_PROJECT_CUR
// SummaryInformation <(0x05)SummaryInformation>
// DocumentSummaryInformation <(0x05)DocumentSummaryInformation>
// Workbook
// CompObj <(0x01)CompObj>
assertEquals(5, _countChildren(src._get_property_table().getRoot()));
assertEquals(5, src.getRoot().getEntryCount());
// Grab the VBA project root
DirectoryEntry vbaProj = (DirectoryEntry)src.getRoot().getEntry("_VBA_PROJECT_CUR");
assertEquals(3, vbaProj.getEntryCount());
// Can't delete yet, has stuff
assertEquals(false, vbaProj.delete());
// Recursively delete
_recursiveDeletee(vbaProj);
// Entries gone
assertEquals(4, _countChildren(src._get_property_table().getRoot()));
assertEquals(4, src.getRoot().getEntryCount());
// Done
src.close();
}
private void _recursiveDeletee(Entry entry) throws IOException {
if (entry.isDocumentEntry()) {
assertEquals(true, entry.delete());
return;
}
DirectoryEntry dir = (DirectoryEntry)entry;
String[] names = dir.getEntryNames().toArray(new String[dir.getEntryCount()]);
for (String name : names) {
Entry ce = dir.getEntry(name);
_recursiveDeletee(ce);
}
assertEquals(true, dir.delete());
}
@SuppressWarnings("unused")
private int _countChildren(DirectoryProperty p) {
int count = 0;
for (Property cp : p) { count++; }
return count;
}
}