Objective c 如何获取所有包含Cocoa音乐(mp3)的文件夹路径?

Objective c 如何获取所有包含Cocoa音乐(mp3)的文件夹路径?,objective-c,macos,cocoa,enumeration,Objective C,Macos,Cocoa,Enumeration,我是可可新手。我正在尝试在我的应用程序中扫描计算机中的音乐文件夹。但我有一些逻辑。 我需要从/Users开始扫描的内容,例如,如果我有/Users/music/anotherMusic和/Users/music/music2/music3,我需要能够仅获取包含音乐(/Users/music)的文件夹的顶部。并且还需要在子文件夹中继续迭代,以便在根文件夹(/Users/music)中有音乐文件计数。等等,用同样的逻辑继续扫描整个计算机。结果应该显示在表格中,例如结果应该是这样的 -/Users/m

我是可可新手。我正在尝试在我的应用程序中扫描计算机中的音乐文件夹。但我有一些逻辑。 我需要从/Users开始扫描的内容,例如,如果我有/Users/music/anotherMusic和/Users/music/music2/music3,我需要能够仅获取包含音乐(/Users/music)的文件夹的顶部。并且还需要在子文件夹中继续迭代,以便在根文件夹(/Users/music)中有音乐文件计数。等等,用同样的逻辑继续扫描整个计算机。结果应该显示在表格中,例如结果应该是这样的

-/Users/myComputer/iTunes-77个文件夹,500个音乐文件

-/Users/myComputer/Documents/Music-15个音乐文件夹,400个音乐文件

-/Users/myComputer/Downloads/Media-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.
        }
     }

任何想法,或帮助,我都很感激。谢谢

如果我错了,请纠正我。您想获取文件夹中的mp3数量,但文件夹仅包含文件夹和mp3文件,而mp3计数是针对其父文件夹的(如果父文件夹本身仅包含文件夹和mp3,则针对其父文件夹计数,等等),对吗

[manager EnumeratorPath]非常有用,但在这种情况下,您肯定需要维护一个堆栈来跟踪您浏览的文件

在这里,递归就是幸福

- (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);
}

谢谢,它工作得很好,速度也很快!但有一个问题我想不出来。它是按字母顺序扫描的,如果你有文件夹/Users/music/music2/music3,它工作正常,它会显示ss/Users/music。但是,如果您有/Users/music和以字母“A”或更大的“m”开头的音乐歌曲,则结果将是/Users/music和/Users/music/music2,但它应该只是包含音乐的父目录或音乐的子文件夹。我怎么能修好它?谢谢你,有点小错误。在浏览之前,您必须检查一次文件列表,以检查comboBreak布尔值。我会编辑的。非常感谢。我在你编辑后试过了,但还是一样的问题。看看我得到了什么“/Users/Apple/Desktop/w/a/music”=16;“/Users/Apple/Desktop/w/a/music/d”=3;“/Users/Apple/Desktop/w/a/music/d/aa/a/asdfasdf/untitled folder/a”=1;“/Users/Apple/Desktop/w/aaa”=1;但它只能是“/Users/Apple/Desktop/w”,如果字母顺序正确,它有时可以正常工作。我试图修复它,但无法修复,非常感谢您的帮助。您确定这不是因为.DS\u存储文件或其他原因吗?我能够重现您的bug的唯一方法是,当文件夹包含一个隐藏文件(如.DS_STORE)时,该组合会破坏递归(我们确实不希望这样)。我将编辑答案以检查隐藏的文件(并忽略它们)。感谢您对Panos的帮助。复制的方法,例如在桌面上创建文件夹。放一个音乐文件,例如从“R”开始,两个包含音乐的文件夹,按字母顺序命名一个不太“R”,一个更“R”,并在其中放一些音乐,然后尝试运行您将看到的程序。帕诺斯:你是亚美尼亚人吗?