2011-09-26 80 views
1

我是Cocoa的新手。我试图在我的应用程序中扫描计算机上的音乐文件夹。但我有一些逻辑。 我需要从/ Users开始扫描,例如,如果我有/ Users/music/anotherMusic和/ Users/music/music2/music3,我需要只能获得包含音乐(/用户/音乐)。还需要继续在子文件夹中迭代以在根文件夹(/ Users/music)中计算音乐文件。等用同样的逻辑继续扫描整个computer.And结果应该显示在表格中,例如结果应该是这样的如何获取可可中包含音乐(mp3)的所有文件夹路径?

- - /用户/我的电脑/ iTunes的 - 77个文件夹,500个的音乐文件

- /用户/我的电脑/文件/音乐-15音乐文件夹,400个的音乐文件

- /用户/我的电脑/下载/媒体-20音乐文件夹,325个音乐
文件(的数所有苏有音乐的b目录)

我该怎么做?我做了什么,它在下面的代码中。但是它一直在深入,给我每条包含.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. 
     } 
    } 

任何想法,或帮助赞赏。谢谢。

回答

3

纠正我,如果我错了。您想获取文件夹中的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); 
} 
+0

谢谢它非常好,非常快!但有一个问题我不明白。它按照字母顺序扫描,如果你有文件夹/用户/音乐/音乐2 /音乐3,它可以很好地显示/用户/音乐。但是如果你有/用户/音乐和音乐歌曲,以字母'A'或任何大'm'开头,结果将是/ Users/music和/ Users/music/music2,但它应该只是父目录包含音乐或音乐的子文件夹。我如何解决它?非常感谢 – User1234

+0

确实有一点小错误。在浏览之前,您必须检查文件列表以检查comboBreak布尔值。我会编辑它。 – Panos

+0

非常感谢Panos。我在编辑后试过,但仍然是同样的问题。看看我得到“/用户/苹果/桌面/ w/a /音乐”= 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;但它应该只有“/用户/苹果/桌面/ W”它有时很好,如果按字母顺序是正确的。我试图解决它,但我cound't,我感谢您的帮助。 – User1234

相关问题