3

i need to avoid hidden files in this enumeration, but .DS_Store files are still being added.

i put in the NSLog to check, and i am getting output there.

there's probably something obvious, but i can't see it.

NSDirectoryEnumerator *dirEnumerator;
                NSFileManager *fileManager = [[NSFileManager alloc] init];

                dirEnumerator = [fileManager enumeratorAtURL:item 
                                  includingPropertiesForKeys:[NSArray array]
                                                     options:NSDirectoryEnumerationSkipsPackageDescendants || NSDirectoryEnumerationSkipsHiddenFiles 
                                                errorHandler:nil];

                for (NSURL *urlItem in dirEnumerator) { 

                    // is item hidden ?
                    NSNumber *isHidden = nil;
                    if ([urlItem getResourceValue:&isHidden forKey:NSURLIsHiddenKey error:nil]) {
                        if ([isHidden isEqual:[NSNumber numberWithInt:1]]) {

                            NSLog(@"isHidden is 1");
                            continue;
                        }
                    }
lulu
  • 669
  • 10
  • 26

1 Answers1

11

Actually, the real problem is that you're using the wrong operator to specify the mask:

NSDirectoryEnumerationSkipsPackageDescendants ||  NSDirectoryEnumerationSkipsHiddenFiles

does Boolean OR, giving you 1, which isn't a useful options mask. You need to use the single pipe:

NSDirectoryEnumerationSkipsPackageDescendants |  NSDirectoryEnumerationSkipsHiddenFiles

which is bitwise OR.

OLD ANSWER:

You need to actually request the properties that you're going to look at:

dirEnumerator = [fileManager enumeratorAtURL:item 
                  includingPropertiesForKeys:[NSArray arrayWithObject:NSURLIsHiddenKey]
                                     options:NSDirectoryEnumerationSkipsPackageDescendants || NSDirectoryEnumerationSkipsHiddenFiles 
                                errorHandler:nil];

from the -[NSURL getResourceValue:forKey:error:] doc:

Discussion
value is set to nil if the requested resource value is not defined for the URL. In this case, the method still returns YES.

jscs
  • 63,694
  • 13
  • 151
  • 195
  • are you saying that if the option `NSDirectoryEnumerationSkipsHiddenFiles` is used, the enumerator will include 'hidden' files ? that's the part that's confusing me. i thought the option was saying 'don't enumerate hidden files'. – lulu Apr 30 '11 at 02:27
  • @lulu: No, I'm saying you're getting garbage out of your call to `resourceValue:forKey:error:` because you didn't ask the file manager to include that information. – jscs Apr 30 '11 at 02:42
  • @lulu: but in fact I just realized the real problem. See my updated answer. – jscs Apr 30 '11 at 02:43
  • thanks, josh. all is as expected now. an excellent example of 'code blindness'? i'll be checking my pipe(s) in the future. – lulu Apr 30 '11 at 12:41
  • @Lulu: It happens to us all... :) – jscs Apr 30 '11 at 16:50