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/kperry%40apple.com
> 
> This email sent to kpe...@apple.com


_______________________________________________

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

Reply via email to