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

Reply via email to