NSFileManager fileExistsAtPath:isDirectory 问题

Posted

技术标签:

【中文标题】NSFileManager fileExistsAtPath:isDirectory 问题【英文标题】:NSFileManager fileExistsAtPath:isDirectory issue 【发布时间】:2012-02-28 20:24:21 【问题描述】:

有人可以帮助我了解我在使用这种方法时做错了什么吗?

我正在尝试递归检测目录的内容并在每个目录中创建一个 xml 文件。非递归完美地工作并输出正确的 xml 文件。递归阻塞 dir 检测并在“directories”元素下添加所有文件 + dir。

_dirArray = [[NSMutableArray alloc] init];
_fileArray = [[NSMutableArray alloc] init];

NSError *error;
NSFileManager *filemgr = [NSFileManager defaultManager];
NSArray *filelist = [filemgr contentsOfDirectoryAtPath:dirPath error:&error];

for (int i = 0; i < filelist.count; i++)
   
    BOOL isDir;
    NSString *file = [NSString stringWithFormat:@"%@", [filelist objectAtIndex:i]];
    [_pathToDirectoryTextField stringValue], [filelist objectAtIndex:i]];

    if ([filemgr fileExistsAtPath:dirPath isDirectory:&isDir] && isDir) // I think this is what is crapping out.
    
        [_dirArray addObject:file];
    
    else
    
        if ([file hasPrefix:@"."])
        
            // Ignore file.
        
        else
        
            [_fileArray addObject:file];
        
    

感谢任何提示。

【问题讨论】:

【参考方案1】:

我可以看到“if ([fileManager fileExistsAtPath:fontPath isDirectory:&isDir] && isDir)”来自 Apple 在文档中的示例,但是将其逐个复制并与 else 一起使用是一个非常糟糕的主意,除非您只想获得目录或删除的文件,因为它的意思是:

if (itexists and itsadirectory)
     //its a existing directory
     matches directories
else
    //it is not a directory or it does not exist
    matches files that were deleted since you got the listing 

我会这样做:

NSString *dirPath = @"/Volumes/Storage/";

NSError *error;
NSFileManager *filemgr = [NSFileManager defaultManager];
NSArray *filelist = [filemgr contentsOfDirectoryAtPath:dirPath error:&error];

for (NSString *lastPathComponent in filelist) 
    if ([lastPathComponent hasPrefix:@"."]) continue; // Ignore file.
    NSString *fullPath = [dirPath stringByAppendingPathComponent:lastPathComponent];
    BOOL isDir;
    BOOL exists = [filemgr fileExistsAtPath:fullPath isDirectory:&isDir];

    if (exists) 
        if (isDir) 
            [_dirArray addObject:lastPathComponent];                
        else
            [_fileArray addObject:lastPathComponent];                
                            
    
 

【讨论】:

其实我以前就是这样的,但它仍然不适合我。但是,如果您确信它应该......那么也许我的问题出在其他地方。嗯。 没有骰子。但无论哪种方式,这都是一个很好的选择。我会把它留在里面。 啊,它们需要在不同的范围内,例如 if (exists) if (isDir)

以上是关于NSFileManager fileExistsAtPath:isDirectory 问题的主要内容,如果未能解决你的问题,请参考以下文章

NSFilemanager 的使用

NSFileManager

NSFileManager的应用

教程 使用 NSFileManager 存储数据?

NSFileManager和NSFileHandle

NSFileManager - 创建一个只读文件