Skip to content

Commit 717820a

Browse files
authored
fix(core): use enumeratorAtPath for iOS shallow entity enumeration (NativeScript#11182)
1 parent ff74b87 commit 717820a

2 files changed

Lines changed: 25 additions & 10 deletions

File tree

apps/automated/src/file-system/file-system-tests.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,9 +370,11 @@ export var testEnumEntities = function () {
370370
var file = documents.getFile('Test.txt');
371371
var file1 = documents.getFile('Test1.txt');
372372
var testFolder = documents.getFolder('testFolder');
373+
var nestedFile = testFolder.getFile('Nested.txt');
373374
var fileFound = false;
374375
var file1Found = false;
375376
var testFolderFound = false;
377+
var nestedFileFound = false;
376378
var console = {
377379
log: function (file) {
378380
if (file === 'Test.txt') {
@@ -381,6 +383,8 @@ export var testEnumEntities = function () {
381383
file1Found = true;
382384
} else if (file === 'testFolder') {
383385
testFolderFound = true;
386+
} else if (file === 'Nested.txt') {
387+
nestedFileFound = true;
384388
}
385389
},
386390
};
@@ -395,9 +399,11 @@ export var testEnumEntities = function () {
395399
TKUnit.assert(fileFound, 'Failed to enumerate Test.txt');
396400
TKUnit.assert(file1Found, 'Failed to enumerate Test1.txt');
397401
TKUnit.assert(testFolderFound, 'Failed to enumerate testFolder');
402+
TKUnit.assert(!nestedFileFound, 'eachEntity should not enumerate nested files');
398403

399404
file.remove();
400405
file1.remove();
406+
nestedFile.remove();
401407
testFolder.remove();
402408
// << (hide)
403409
// << file-system-enum-content

packages/core/file-system/file-system-access.ios.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -629,27 +629,34 @@ export class FileSystemAccess {
629629
private enumEntities(path: string, callback: (entity: { path: string; name: string; extension: string }) => boolean, onError?: (error) => any) {
630630
try {
631631
const fileManager = NSFileManager.defaultManager;
632-
let files: NSArray<string>;
633-
try {
634-
files = fileManager.contentsOfDirectoryAtPathError(path);
635-
} catch (ex) {
636-
if (onError) {
637-
onError(new Error("Failed to enum files for folder '" + path + "': " + ex));
638-
}
632+
if (!this.folderExists(path)) {
633+
console.error(`Failed to enum files for folder '${path}': no folder exists at path`);
634+
return;
635+
}
639636

637+
const enumerator = fileManager.enumeratorAtPath(path);
638+
if (!enumerator) {
639+
console.error(`Failed to enum files for folder '${path}': unable to create directory enumerator`);
640640
return;
641641
}
642642

643-
for (let i = 0; i < files.count; i++) {
644-
const file = files.objectAtIndex(i);
643+
let file = enumerator.nextObject() as string;
644+
while (file) {
645+
// Only surface direct children to match the previous shallow enumeration contract.
646+
if (enumerator.level > 1) {
647+
file = enumerator.nextObject() as string;
648+
continue;
649+
}
645650

646651
const info = {
647652
path: this.concatPath(path, file),
648653
name: file,
649654
extension: '',
650655
};
651656

652-
if (!this.folderExists(this.joinPath(path, file))) {
657+
if (this.folderExists(this.joinPath(path, file))) {
658+
enumerator.skipDescendants();
659+
} else {
653660
info.extension = this.getFileExtension(info.path);
654661
}
655662

@@ -658,6 +665,8 @@ export class FileSystemAccess {
658665
// the callback returned false meaning we should stop the iteration
659666
break;
660667
}
668+
669+
file = enumerator.nextObject() as string;
661670
}
662671
} catch (ex) {
663672
if (onError) {

0 commit comments

Comments
 (0)