diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileStreamer.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileStreamer.java index 8d19380..9340959 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileStreamer.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileStreamer.java @@ -173,7 +173,7 @@ public class FileStreamer { private FileTupleIterator() { for (FormattedDisk formattedDisk : formattedDisks) { - files.addAll(toTupleList(FileTuple.of(formattedDisk))); + files.add(FileTuple.of(formattedDisk)); } } @@ -190,6 +190,12 @@ public class FileStreamer { currentDisk = tuple.formattedDisk; beforeDisk.accept(currentDisk); } + // Handle disks independently and guarantee disk events fire for empty disks + if (tuple.isDisk()) { + tuple = files.removeFirst(); + files.addAll(0, toTupleList(tuple)); + return hasNext(); + } } else { if (currentDisk != null) { afterDisk.accept(currentDisk); @@ -203,7 +209,7 @@ public class FileStreamer { public FileTuple next() { if (hasNext()) { FileTuple tuple = files.removeFirst(); - if (recursiveFlag && tuple.fileEntry.isDirectory()) { + if (recursiveFlag && tuple.isDirectory()) { FileTuple newTuple = tuple.pushd(tuple.fileEntry); files.addAll(0, toTupleList(newTuple)); } diff --git a/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileTuple.java b/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileTuple.java index 9bd9a1f..73df375 100644 --- a/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileTuple.java +++ b/lib/ac-api/src/main/java/com/webcodepro/applecommander/util/filestreamer/FileTuple.java @@ -52,6 +52,16 @@ public class FileTuple { newPaths.add(directoryEntry.getFilename()); return new FileTuple(formattedDisk, newPaths, (DirectoryEntry)directoryEntry, null); } + public boolean isDisk() { + // Just in case directoryEntry is unset or is a disk - looks like either cna occur! + return fileEntry == null && (directoryEntry == null || directoryEntry == formattedDisk); + } + public boolean isDirectory() { + return !isDisk() && (fileEntry == null || fileEntry.isDirectory()); + } + public boolean isFile() { + return fileEntry != null && !fileEntry.isDirectory(); + } public FileTuple of(FileEntry fileEntry) { return new FileTuple(formattedDisk, paths, directoryEntry, fileEntry); }