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

Reply via email to