Проверьте атрибуты элементов в каталоге в Objective-C - PullRequest
0 голосов
/ 04 февраля 2011

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

    #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;
}

Ответы [ 3 ]

1 голос
/ 04 февраля 2011
    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 голос
/ 04 февраля 2011

Краткие мысли (сообщение с мобильного телефона):

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

Как это?

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 содержит все непосредственные подкаталоги.

...