【问题标题】:Why is NSDirectoryEnumerator picking up hidden files here?为什么 NSDirectoryEnumerator 在这里提取隐藏文件?
【发布时间】:2011-08-15 15:57:01
【问题描述】:

我需要避免在此枚举中隐藏文件,但仍在添加 .DS_Store 文件。

我输入了 NSLog 来检查,我在那里得到了输出。

可能有一些明显的东西,但我看不到。

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;
                        }
                    }

【问题讨论】:

    标签: cocoa macos nsfilemanager


    【解决方案1】:

    实际上,真正的问题是您使用了错误的运算符来指定掩码:

    NSDirectoryEnumerationSkipsPackageDescendants ||  NSDirectoryEnumerationSkipsHiddenFiles
    

    布尔值OR,给你1,这不是一个有用的选项掩码。您需要使用单管道:

    NSDirectoryEnumerationSkipsPackageDescendants |  NSDirectoryEnumerationSkipsHiddenFiles
    

    这是按位OR

    旧答案:

    您需要实际请求要查看的属性:

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

    来自-[NSURL getResourceValue:forKey:error:] 文档:

    讨论
    如果未为 URL 定义请求的资源值,则 value 设置为 nil。在这种情况下,该方法仍然返回 YES。

    【讨论】:

    • 您是说如果使用选项NSDirectoryEnumerationSkipsHiddenFiles,枚举器将包含“隐藏”文件?这就是让我困惑的部分。我以为选项是说“不要枚举隐藏文件”。
    • @lulu:不,我是说你在调用resourceValue:forKey:error: 时遇到了垃圾,因为你没有要求文件管理器包含这些信息。
    • @lulu:但实际上我才意识到真正的问题。请参阅我的更新答案。
    • 谢谢,乔希。现在一切都如预期的那样。 “代码盲点”的一个很好的例子?我将来会检查我的管道。
    • @Lulu:这发生在我们所有人身上...... :)
    猜你喜欢
    • 2018-01-27
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多