Thanks very much for the suggestion. I've just given that a try, but it doesn't make any difference. The enumeration still stops early, but the error handler block doesn't get called, making me think there's no error; the enumeration simply thinks it's finished.
Anything else I could try. FWIW, I've just installed 10.8 and it's still happening. M On 27 Jul 2012, at 18:10, Kevin Perry <kpe...@apple.com> wrote: > You should probably try -[NSFileManager > enumeratorAtURL:includingPropertiesForKeys:options:errorHandler:]. The > errorHandler block will give you more detail about any errors that occur in > the middle of the enumeration (and give you the ability to ignore them). > > -KP > > On Jul 27, 2012, at 9:44 AM, Mark Allan <markjal...@blueyonder.co.uk> wrote: > >> Hi all, >> >> Apologies for asking a question which has been asked many times before, but >> I can't seem to find an answer to this particular one. >> >> I'm trying to list a directory recursively to build up a snapshot of the >> contents and store them in a core data DB, but keep running into issues with >> the directory list. The core data part is working fine as far as I can tell! >> >> I've tried writing a recursive method to call scandir() until the whole tree >> has been visited, but I'm coming unstuck converting NSStrings to const char* >> to char*. Unless I supply the path directly as a hard-coded C-string >> "/Users/mark", it works for a while, but then sometimes it forgets to add >> "/Users/mark" and starts scanning directories at the root of my HD! Hard >> coding the C string works perfectly but obviously isn't an option. >> >> -(void) scan: (char *)theDir{ >> struct dirent **namelist; >> int n; >> size_t thisDirLength = strlen(theDir); >> >> n = scandir(theDir, &namelist, 0, NULL); >> if (n < 0){ >> perror("scandir"); >> } >> else { >> while(n--) { >> theCounter++; >> if (theCounter >= 1000) { >> theCounter = 0; >> [[self managedObjectContext] save:NULL]; >> [[self managedObjectContext] reset]; >> [thePool drain]; >> thePool = [[NSAutoreleasePool alloc] init]; >> } >> if ((strcmp(namelist[n]->d_name,".") != 0) && >> (strcmp(namelist[n]->d_name,"..") != 0)) { >> char* fullPath = malloc(thisDirLength + >> strlen(namelist[n]->d_name) + 2); >> strcpy(fullPath, theDir); >> strcat(fullPath, "/"); >> strcat(fullPath, namelist[n]->d_name); >> >> [self addEntityWithPath:[NSString >> stringWithCString:fullPath encoding:NSUTF8StringEncoding]]; >> >> if (namelist[n]->d_type == DT_DIR) { >> [self scan:fullPath]; >> } >> free(fullPath); >> } >> free(namelist[n]); >> } >> free(namelist); >> } >> } >> >> >> I then gave up on that approach and opted for the easier but slower cocoa >> solution (NSDirectoryEnumerator) but for some reason it gives up with >> neither an error nor a warning about half way through the tree. Could it be >> that modifications to the file system during the enumeration are causing it >> to fail? >> >> >> -(void) startSnapshotForPath:(NSString *) thePath { >> int theCounter = 0; >> NSDirectoryEnumerator *dirEnumerator = [[NSFileManager defaultManager] >> enumeratorAtPath: thePath]; >> thePool = [[NSAutoreleasePool alloc] init]; >> >> for (NSString *theSubPath in dirEnumerator) { >> [self addEntityWithPath:[thePath >> stringByAppendingPathComponent:theSubPath]]; >> theCounter++; >> if (theCounter >= 1000) { >> theCounter = 0; >> [[self managedObjectContext] save:NULL]; >> [[self managedObjectContext] reset]; >> [thePool drain]; >> thePool = [[NSAutoreleasePool alloc] init]; >> } >> } >> >> [[self managedObjectContext] save:NULL]; >> [[self managedObjectContext] reset]; >> [thePool drain]; >> } >> >> I've also tried Uli Kusterer's UKDirectoryEnumerator but that doesn't appear >> to be recursive! I suspect (although I haven't tried) that requesting the >> type of the path (i.e. file/directory) and creating a new >> UKDirectoryEnumerator for each subdirectory would be massively expensive. >> >> Does anyone have any suggestions for where I can go from here please? How >> can I find out why NSDirectoryEnumerator is failing half-way through the >> process, and how can I stop it doing so? Failing that, does anyone have a >> better suggestion for how I can build the snapshot please? >> >> Many thanks >> Mark _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com