Objective c 如何获取所有包含Cocoa音乐(mp3)的文件夹路径?
我是可可新手。我正在尝试在我的应用程序中扫描计算机中的音乐文件夹。但我有一些逻辑。 我需要从/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个音乐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
文件(包含音乐的所有子目录计数) 我怎么能做到?我所做的,在下面的代码中。但是它会一直深入下去,给我每个包含.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”,并在其中放一些音乐,然后尝试运行您将看到的程序。帕诺斯:你是亚美尼亚人吗?