2014-07-18 3 views
0

간단한 재귀 함수를 사용하여 NSDirectoryEnumerator을 모방하고 싶습니다. 그러나 지금까지의 시도에서 내 루프가 너무 일찍 중단되었습니다.Objective-c 재귀, 고급 재귀 적 메서드 구축

번째 레벨에 더 이상 디렉토리 나 파일이없는 경우이 방법을 중지해야합니다.

어떻게하면 아래의 방법을 다시 재귀 적으로 단순하게 재귀 적으로 종료 할 수 있습니까?

도움을 주시면 감사하겠습니다. 감사.

#import "MenuFromPathData.h" 

@interface MenuFromPathData() 

@property (nonatomic,strong) NSFileManager *myFileManager; 

@end 

@implementation MenuFromPathData 

@synthesize myFileManager=_myFileManager; 

#define ROOT_DIRECTORY @"TextData" 

// 
//// 
// 

- (void) simpleMenuArrayBuilder 
{ 
    NSArray *fileNamesLevel1 = [self fullArrayReturn:ROOT_DIRECTORY]; 

    for(int i = 0; i < [fileNamesLevel1 count]; i++) 
    { 
     NSString *pathNameLevel2 = [NSString stringWithFormat:@"%@/%@",ROOT_DIRECTORY,[fileNamesLevel1 objectAtIndex:i]]; 
     NSArray *fileNamesLevel2 = [self fullArrayReturn:pathNameLevel2]; 

     for(int j = 0; j < [fileNamesLevel2 count]; j++) 
     { 
      NSString *pathNameLevel3 = [NSString stringWithFormat:@"%@/%@/%@",ROOT_DIRECTORY,[fileNamesLevel1 objectAtIndex:i],[fileNamesLevel2 objectAtIndex:j] ]; 
      NSArray *fileNamesLevel3 = [self fullArrayReturn:pathNameLevel3]; 

      for(int k = 0; k < [fileNamesLevel3 count]; k++) 
      { 
       NSString *pathNameLevel4 = [NSString stringWithFormat:@"%@/%@/%@/%@",ROOT_DIRECTORY,[fileNamesLevel1 objectAtIndex:i],[fileNamesLevel2 objectAtIndex:j],[fileNamesLevel3 objectAtIndex:k] ]; 
       NSArray *fileNamesLevel4 = [self fullArrayReturn:pathNameLevel4]; 

       for(int l = 0; l < [fileNamesLevel4 count]; l++) 
       { 
        NSString *pathNameLevel5 = [NSString stringWithFormat:@"%@/%@/%@/%@/%@",ROOT_DIRECTORY,[fileNamesLevel1 objectAtIndex:i],[fileNamesLevel2 objectAtIndex:j],[fileNamesLevel3 objectAtIndex:k],[fileNamesLevel4 objectAtIndex:l] ]; 
        NSArray *fileNamesLevel5 = [self fullArrayReturn:pathNameLevel5]; 

        for(int m = 0; m < [fileNamesLevel5 count]; m++) 
        { 
         NSString *pathNameLevel6 = [NSString stringWithFormat:@"%@/%@/%@/%@/%@/%@",ROOT_DIRECTORY,[fileNamesLevel1 objectAtIndex:i],[fileNamesLevel2 objectAtIndex:j],[fileNamesLevel3 objectAtIndex:k],[fileNamesLevel4 objectAtIndex:l], [fileNamesLevel5 objectAtIndex:m] ]; 
         NSArray *fileNamesLevel6 = [self fullArrayReturn:pathNameLevel6]; 
         NSLog(@"-- LVL 6.0 %@ -- ",pathNameLevel6); 

         for(int n = 0; n < [fileNamesLevel6 count]; n++) 
         { 
          NSString *pathNameLevel7 = [NSString stringWithFormat:@"%@/%@/%@/%@/%@/%@%@",ROOT_DIRECTORY,[fileNamesLevel1 objectAtIndex:i],[fileNamesLevel2 objectAtIndex:j],[fileNamesLevel3 objectAtIndex:k],[fileNamesLevel4 objectAtIndex:l], [fileNamesLevel5 objectAtIndex:m],[fileNamesLevel6 objectAtIndex:n] ]; 
          NSArray *fileNamesLevel7 = [self fullArrayReturn:pathNameLevel7]; 
          NSLog(@"-- LVL 7.0 %@ -- ",pathNameLevel7); 


         } 
        } 
       } 
      } 
     } 
    } 
} 

// 
//// 
// 

- (NSString*) resourcePath : (NSString*) pathName { 
    return [[NSBundle mainBundle] pathForResource:pathName ofType:nil]; 
} 

- (NSArray*) bundleArrayReturn : (NSString*)pathForResource { 
    NSError* error; 
    return [self.myFileManager contentsOfDirectoryAtPath:pathForResource error:&error]; 
} 

- (NSArray*) fullArrayReturn : (NSString*) pathName { 
    return [self bundleArrayReturn:[self resourcePath: pathName]]; 
} 

// 
//// 
// 

- (NSFileManager*) myFileManager { 
    if(!_myFileManager) { 
     _myFileManager = [NSFileManager defaultManager]; 
    } 
    return _myFileManager; 
} 

@end 

답변

1

이와 비슷한 것이 좋습니다. 트릭은 다른 매개 변수를 메서드에 추가하여 재귀 중 현재 심도를 추적하는 것입니다.

[self simpleMenuArrayBuilderForPath:ROOT_DIRECTORY allowedDepth:5]; 
+0

완벽한 :

- (void) simpleMenuArrayBuilderForPath:(NSString*)pathToDecend allowedDepth:(int)depth { // if we've defended far enough, then stop if(depth == 0) return; // otherwise, get the next directory listing at this level NSArray *fileNamesNextLevel = [self fullArrayReturn:pathToDecend]; for(int i = 0; i < [fileNamesNextLevel count]; i++) { // find each path inside the directory we're looking at NSString *nextLevelPathName = [pathToDecend stringByAppendingPathComponent:[fileNamesNextLevel objectAtIndex:i]]; // process it however you want... NSLog(@"Looking at %@", nextLevelPathName); // and recur into it [self simpleMenuArrayBuilderForPath:nextLevelPathName allowedDepth:depth-1]; } } 

다음에 의해 호출! 훌륭함! 도움에 감사드립니다! 재귀 권한을 얻을 수 없습니다. 이 메서드는 NSDirectoryEnumerator를 사용하는 것보다 훨씬 더 우아합니다. – MGM