Как получить все пути к папкам, которые содержат музыку (mp3) в Какао? - PullRequest
1 голос
/ 27 сентября 2011

Я новичок в Какао. Я пытаюсь проверить компьютер на наличие музыкальных папок в моем приложении. Но у меня есть логика для этого. Что мне нужно для начала сканирования из / Users, например, если у меня есть / Users / музыка / anotherMusic и / Users / музыка / music2 / music3, мне нужно иметь возможность получить только верхнюю часть для тех папок, которые содержат музыку (/ Users /Музыка ). А также необходимо продолжить итерацию в подпапках, чтобы иметь количество музыкальных файлов в корневой папке (/ Users / music). И так далее с той же логикой продолжайте сканирование всего компьютера. И результаты должны отображаться в таблице, например РЕЗУЛЬТАТЫ должно быть так

- - / Пользователи / myComputer / iTunes - 77 папок, 500 музыкальных файлов

- / Users / myComputer / Documents / Music -15 музыкальных папок, 400 музыкальных файлов

- / Пользователи / myComputer / Загрузки / Медиа -20 музыкальных папок, 325 музыкальных файлов
файлы (количество подкаталогов с музыкой)

Как я могу это сделать? Что я сделал, это в коде ниже. Но он углубляется до глубины и дает мне каждый путь, содержащий музыку .mp3, но мне нужна логика, как упомянуто выше.

NSFileManager *manager = [NSFileManager defaultManager];

       NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:@"/Users/"];                  
        NSString * file;
      while((file=[direnum nextObject]))
      {
          NSString * FullPath=[NSString stringWithFormat:@"/Users/%@",file];

          if ([file hasSuffix:@".mp3"])
        { 
          ///gives a music file path that contains mp3, or I can cut last part, and get the folder path. But no logic as should be.
        }
     }

Любые идеи, или помощь приветствуется. Благодарю.

1 Ответ

3 голосов
/ 27 сентября 2011

Поправь меня, если я ошибаюсь. Вы хотите получить количество mp3 в своей папке, но в то время как папка содержит только папки и файлы mp3, счетчик mp3 относится к своей родительской папке (и если сам родитель содержит только папки и mp3, он учитывает его родитель и т. д.) верно?

[manager enumeratorAtPath] весьма полезен, но в этом случае вам, безусловно, потребуется поддерживать стек для отслеживания просмотренных вами файлов.

Рекурсия здесь блаженство.

- (BOOL)isMp3File:(NSString*)file
{
    return [file hasSuffix:@".mp3"];
}

- (BOOL)isHiddenFile:(NSString*)file
{
    return [file hasPrefix:@"."];
}

- (void)parseForMp3:(NSMutableDictionary*)dic
             inPath:(NSString*)currentPath
          forFolder:(NSString*)folder
{
    BOOL comboBreak = false;
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError* error;
    NSArray* files = [fileManager contentsOfDirectoryAtPath:currentPath error:&error];
    if (error)
    {
        //throw error or anything
    }
    for (NSString *file in files)
    {
        BOOL isDirectory = false;
        NSString *fullPath = [NSString stringWithFormat:@"%@/%@", currentPath, file];
        [fileManager fileExistsAtPath:fullPath isDirectory:&isDirectory];
        comboBreak = comboBreak || (!isDirectory &&
                                    ![self isMp3File:file] &&
                                    ![self isHiddenFile:file]);
        if (comboBreak)
            break;
    }
    for (NSString *file in files)
    {
        BOOL isDirectory = false;
        NSString *fullPath = [NSString stringWithFormat:@"%@/%@", currentPath, file];
        [fileManager fileExistsAtPath:fullPath isDirectory:&isDirectory];
        if (isDirectory)
        {
            if (!comboBreak)
            {
                [self parseForMp3:dic inPath:fullPath forFolder:folder];
            }
            else
            {
                [self parseForMp3:dic inPath:fullPath forFolder:fullPath];
            }
        }
        else if ([self isMp3File:file])
        {
            NSNumber *oldValue = [dic valueForKey:folder];
            oldValue = [NSNumber numberWithUnsignedInteger:[oldValue unsignedIntegerValue] + 1];
            [dic setValue:oldValue forKey:folder];
        }
    }
}


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application
    NSMutableDictionary *dic = [NSMutableDictionary dictionary];
    [self parseForMp3:dic inPath:@"/Users/panosbaroudjian" forFolder:@"/Users/panosbaroudjian"];
    NSLog(@"%@", dic);
}
...