diff --git a/apps/automated/src/file-system/file-system-tests.ts b/apps/automated/src/file-system/file-system-tests.ts index b78254ae01..adafca0f8b 100644 --- a/apps/automated/src/file-system/file-system-tests.ts +++ b/apps/automated/src/file-system/file-system-tests.ts @@ -370,9 +370,11 @@ export var testEnumEntities = function () { var file = documents.getFile('Test.txt'); var file1 = documents.getFile('Test1.txt'); var testFolder = documents.getFolder('testFolder'); + var nestedFile = testFolder.getFile('Nested.txt'); var fileFound = false; var file1Found = false; var testFolderFound = false; + var nestedFileFound = false; var console = { log: function (file) { if (file === 'Test.txt') { @@ -381,6 +383,8 @@ export var testEnumEntities = function () { file1Found = true; } else if (file === 'testFolder') { testFolderFound = true; + } else if (file === 'Nested.txt') { + nestedFileFound = true; } }, }; @@ -395,9 +399,11 @@ export var testEnumEntities = function () { TKUnit.assert(fileFound, 'Failed to enumerate Test.txt'); TKUnit.assert(file1Found, 'Failed to enumerate Test1.txt'); TKUnit.assert(testFolderFound, 'Failed to enumerate testFolder'); + TKUnit.assert(!nestedFileFound, 'eachEntity should not enumerate nested files'); file.remove(); file1.remove(); + nestedFile.remove(); testFolder.remove(); // << (hide) // << file-system-enum-content diff --git a/packages/core/file-system/file-system-access.ios.ts b/packages/core/file-system/file-system-access.ios.ts index e879bc8513..a7968c7f44 100644 --- a/packages/core/file-system/file-system-access.ios.ts +++ b/packages/core/file-system/file-system-access.ios.ts @@ -629,19 +629,24 @@ export class FileSystemAccess { private enumEntities(path: string, callback: (entity: { path: string; name: string; extension: string }) => boolean, onError?: (error) => any) { try { const fileManager = NSFileManager.defaultManager; - let files: NSArray; - try { - files = fileManager.contentsOfDirectoryAtPathError(path); - } catch (ex) { - if (onError) { - onError(new Error("Failed to enum files for folder '" + path + "': " + ex)); - } + if (!this.folderExists(path)) { + console.error(`Failed to enum files for folder '${path}': no folder exists at path`); + return; + } + const enumerator = fileManager.enumeratorAtPath(path); + if (!enumerator) { + console.error(`Failed to enum files for folder '${path}': unable to create directory enumerator`); return; } - for (let i = 0; i < files.count; i++) { - const file = files.objectAtIndex(i); + let file = enumerator.nextObject() as string; + while (file) { + // Only surface direct children to match the previous shallow enumeration contract. + if (enumerator.level > 1) { + file = enumerator.nextObject() as string; + continue; + } const info = { path: this.concatPath(path, file), @@ -649,7 +654,9 @@ export class FileSystemAccess { extension: '', }; - if (!this.folderExists(this.joinPath(path, file))) { + if (this.folderExists(this.joinPath(path, file))) { + enumerator.skipDescendants(); + } else { info.extension = this.getFileExtension(info.path); } @@ -658,6 +665,8 @@ export class FileSystemAccess { // the callback returned false meaning we should stop the iteration break; } + + file = enumerator.nextObject() as string; } } catch (ex) { if (onError) {