iPhone:NSFileManager fileExistsAtPath:isDirectory:无法正常工作?

7

我正在为越狱的iPhone开发一款应用程序。我想要获取一个文件夹中的所有目录,所以我正在尝试这样做:

NSArray *contentOfFolder = [[NSFileManager defaultManager] directoryContentsAtPath:path];
NSLog(@"contentOfFolder: %@", contentOfFolder);
directoriesOfFolder = [[NSMutableArray alloc] initWithCapacity:100];
for (NSString *aPath in contentOfFolder) {
    NSLog(@"apath: %@", aPath);

    BOOL isDir;
if ([[NSFileManager defaultManager] fileExistsAtPath:aPath isDirectory:&isDir] &&isDir)
    {
        [directoriesOfFolder addObject:aPath];
        NSLog(@"directoriesOfFolder %@", directoriesOfFolder);
    }
}
NSLog(@"dirctories %@", directoriesOfFolder);

但是看看我得到的结果。当我获取文件夹的内容时,一切看起来都很好:
2009-07-28 23:23:35.930 Drowser[573:207] 新路径 / private / var 2009-07-28 23:23:35.945 Drowser[573:207] 文件夹内容:(     钥匙串,     “管理首选项”     移动设备,     备份,     缓存,     数据库,     电子艺术,     空,     文件夹,     图书馆,     本地,     锁定,     日志,     日志,     手机,     消息,     偏好设置,     根,     运行,     印花,     储藏,     温度,     vm )
但随后:
2009-07-28 23:23:35.950 Drowser[573:207] 路径:Keychains 2009-07-28 23:23:35.954 Drowser[573:207] 路径:Managed Preferences 2009-07-28 23:23:35.959 Drowser[573:207] 路径:MobileDevice 2009-07-28 23:23:35.984 Drowser[573:207] 路径:backups 2009-07-28 23:23:35.993 Drowser[573:207] 路径:cache 2009-07-28 23:23:36.002 Drowser[573:207] 路径:db 2009-07-28 23:23:36.011 Drowser[573:207] 路径:ea 2009-07-28 23:23:36.019 Drowser[573:207] 路径:empty 2009-07-28 23:23:36.028 Drowser[573:207] 路径:folders 2009-07-28 23:23:36.037 Drowser[573:207] 路径:lib 2009-07-28 23:23:36.046 Drowser[573:207] 文件夹列表 (     图书馆 )
只有"lib"被识别为文件夹。这怎么可能?其他的也是文件夹。我通过SSH确认了这一点。
有人有什么想法吗?我做错了什么吗?
1个回答

23

这是一个非常容易犯的错误,但也很容易修复。枚举目录内容只会给你提供项目的名称,而不是项目的完整路径。你必须自己构建完整的路径。所以你原来的代码:

for (NSString *aPath in contentOfFolder) {
  NSLog(@"apath: %@", aPath);

  BOOL isDir;
  if ([[NSFileManager defaultManager] fileExistsAtPath:aPath isDirectory:&isDir] &&isDir) {
    [directoriesOfFolder addObject:aPath];
    NSLog(@"directoriesOfFolder %@", directoriesOfFolder);
  }
}

你实际上应该有这个:

for (NSString *aPath in contentOfFolder) {
  NSString * fullPath = [path stringByAppendingPathComponent:aPath];

  BOOL isDir;
  if ([[NSFileManager defaultManager] fileExistsAtPath:fullPath isDirectory:&isDir] &&isDir) {
    [directoriesOfFolder addObject: fullPath];
  }
}

2
我相信我只是在指针语法方面暴露了我的无知,但是你不想在“&&”和“isDir”之间加一个空格吗? - Dan Rosenstark
@Yar:我通常会加上一个,但这次手滑漏了。然而,我认为语法上并不需要它。 - Dave DeLong
明白了,只是确认我没有漏掉什么。谢谢。 - Dan Rosenstark

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接