2011-02-04 2 views
0

Я сделал этот маленький код, чтобы проверить, сколько подкаталогов находится в заданном каталоге. Он проверяет только первый уровень, все равно я могу сделать его более простым? Я добавил комментарии, может быть, легче понять мое намерение. Спасибо!Проверьте атрибут элементов в каталоге Objective-C

#import <Foundation/Foundation.h>    
      int main (int argc, const char * argv[]){ 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 



// insert code here... 
NSFileManager *filemgr; 
NSMutableArray *listOfFiles; 
NSDictionary *listOfFolders; 
NSDictionary *controllDir; 
int i, count; 
NSString *myPath; 

filemgr = [NSFileManager defaultManager]; 

myPath = @"/"; 

// list the files in the given directory (myPath) 

listOfFiles = [filemgr directoryContentsAtPath: myPath]; 

// count the number of elements in the array 
count = [listOfFiles count]; 

// check them one by one 
for (i = 0; i < count; i++) 
{ 
    // I need the full path 
    NSString *filePath =[NSString stringWithFormat:@"%@/%@", myPath, [listOfFiles objectAtIndex: i]]; 

    // add every item with its attributes 
    listOfFolders = [filemgr attributesOfItemAtPath:filePath error:NULL]; 

    // to avoid typo get the attribute and create a string 
    controllDir = [filemgr attributesOfItemAtPath:@"/" error:NULL]; 
    NSString *toCheck = [NSString stringWithFormat:@"%@", [controllDir objectForKey:NSFileType]]; 

    // the folder elements one by one 
    NSString *fileType = [NSString stringWithFormat:@"%@", [listOfFolders objectForKey:NSFileType]];  


    if([toCheck isEqualToString:fileType]) 
     { 
      NSLog(@"NAME: %@ TYPE: %@" ,[listOfFiles objectAtIndex:i],[listOfFolders objectForKey:NSFileType]); 
     }     
}    

[pool drain]; 
return 0; 
} 

ответ

0

Как это?

NSFileManager *fm = [NSFileManager defaultManager]; 
NSError *error; 
NSArray *subpaths = [fm contentsOfDirectoryAtPath:myPath error:&error]; 
if (!subpaths) ...handle error. 
NSMutableArray *subdirs = [NSMutableArray array]; 
for (NSString *name in subpaths) 
{ 
    NSString *subpath = [myPath stringByAppendingPathComponent:name]; 
    BOOL isDir; 
    if ([fm fileExistsAtPath:subpath isDirectory:&isDir] && 
     isDir) 
    { 
     [subdirs addObject:subpath]; 
    } 
} 

Теперь subdirs массив содержит все непосредственные подкаталоги.

+0

Мое единственное, что касается этого, что если я проверю содержимое массива, вернет мне только числа, а не имена папок. Что O сделал неправильно? –

1
NSURL *url = [NSURL fileURLWithPath:@"/Users"]; 
    NSError *error; 
    NSArray *items = [[NSFileManager defaultManager] 
         contentsOfDirectoryAtURL:url 
         includingPropertiesForKeys:[NSArray array] 
         options:0 
         error:&error]; 

    NSMutableArray *dirs = [NSMutableArray array]; 
    for (NSURL *url in items) { 
     if (CFURLHasDirectoryPath((CFURLRef)url)) { 
      [dirs addObject:url]; 
     } 
    } 
} 

Вы можете получить фантазии с блоками таким образом:

NSPredicate *predicate = [NSPredicate predicateWithBlock: 
     ^BOOL (id evaluatedObject, NSDictionary *bindings){ 
      return CFURLHasDirectoryPath((CFURLRef)evaluatedObject); }]; 
NSArray *dirs = [items filteredArrayUsingPredicate:predicate]); 

отметить здесь является то, что он только попадает на диск в один раз, и не тратить время на извлечение ненужных атрибутов. После того, как вы построите NSURL, вы всегда можете указать, является ли это каталогом, поскольку он заканчивается на/(это указано поведение). Вот и все CFURLHasDirectoryPath() делает. На самом деле он не попал на диск.

1

Краткие мысли (проводки с сотового телефона):

  • использовать NSDirectoryEnumerator.
  • у него есть метод под названием fileAttributes, который вернет NSDictionary с атрибутами предмета.
  • NSDictionary имеет метод fileType, который возвращает константу, указывающую вид элемента.
  • есть хорошая константа, называемая NSFileTypeDirectory, которую вы можете использовать для сравнения.
Смежные вопросы