2013-04-10 30 views
2

我使用這兩種遞歸的方法來找到特定的文件夾的iOS陣列沒有被完全

- (NSMutableArray *)getFilePathsFromDirectory:(NSString *)directory{ 
NSMutableArray *contents = [[NSMutableArray alloc] init]; 
NSArray *arr = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:directory error:nil]; 
for (NSString *file in arr) { 
    BOOL isDir; 
    [[NSFileManager defaultManager] fileExistsAtPath:[directory stringByAppendingPathComponent:file] isDirectory:&isDir]; 
    if (!isDir) { 
     [contents addObject:[directory stringByAppendingPathComponent:file]]; 
    } 
    else{ 
     [contents addObject:[directory stringByAppendingPathComponent:file]]; 
     [contents addObject:[self getFilePathsFromDirectory:[directory stringByAppendingPathComponent:file]]]; 
    } 
} 
return contents; 
} 

- (NSString *)getPathForItemNamed:(NSString *)name array:(NSMutableArray *)arr{ 
NSString *str; 
if (name) { 
    for (NSString *s in arr) { 
     if ([s isKindOfClass:[NSString class]]) { 
      if ([[s lastPathComponent] isEqualToString:name]) { 
       return s; 
      } 
     } 
    } 
    for (NSMutableArray *aq in arr) { 
     if ([aq isKindOfClass:[NSMutableArray class]]) { 
      str = [self getPathForItemNamed:name array:aq]; 
      return str; 
     } 
    } 
} 
return str; 
} 

文件和目錄的路徑,填充但問題是,通過一定量的子目錄中去後(3 -5),這將停止返回任何路徑並返回(null)。我覺得這樣做與數組沒有被所有目錄填充之前,由於某種原因返回。繼承人我怎麼稱呼這些

NSMutableArray *paths = [self getContentsOfPaths:[self downloadsDir]]; 

path = [self getPathForItemNamed:[tableView cellForRowAtIndexPath:indexPath].textLabel.text array:paths]; 
NSLog(@"%@", path); 
+0

你似乎沒有使用getPathForNamed:數組:這裏的。另外,當你正在做遞歸時,你將返回的數組添加到當前數組中。你是否想要添加返回數組的內容? – 2013-04-11 00:17:00

+0

我使用了舊代碼,這就是爲什麼它看起來像'getPathForItemNamed:array:'沒有被調用,我的一個錯字。我添加數組的原因是它爲原始目錄中的每個子目錄添加一個數組。 – 2013-04-11 00:29:37

回答

1

有兩個問題與getPathForItemNamed:方法:

  • 如果無法找到名稱的文件,它返回一個未初始化的變量str的值。這是未定義的行爲 - 您需要在初始化時將str設置爲nil。事實上,根本不需要str(請參閱下面的修復)。
  • 當它發現它的第一個子目錄時,它假定它正在查找的文件必須在該子目錄內,即使它不是。無論返回的getPathForItemNamed:的第一級遞歸調用是否成爲頂級調用的返回結果。這很糟糕:如果您要查找的文件位於第二個子目錄的子樹中,則永遠不會找到它!

這裏是你如何修復你的方法:

- (NSString *)getPathForItemNamed:(NSString *)name array:(NSMutableArray *)arr{ 
    if (!name) return nil; 
    for (NSString *s in arr) { 
     if ([s isKindOfClass:[NSString class]]) { 
      if ([[s lastPathComponent] isEqualToString:name]) { 
       return s; 
      } 
     } 
    } 
    for (NSMutableArray *aq in arr) { 
     if ([aq isKindOfClass:[NSMutableArray class]]) { 
      str = [self getPathForItemNamed:name array:aq]; 
      // Return something only when you find something 
      if (str) return str; 
     } 
    } 
    return nil; // You do not need str at all. 
} 
+0

這解決了它。謝謝。 – 2013-04-11 02:47:17