2013-01-01 49 views
4

文件搜索我的工作在iPhone项目的一些文件操作。在哪里我需要搜索特定扩展名的文件。一种选择是手动处理每个文件&目录来查找。 我的问题是,有没有简单的方法来做到这一点?与特定的扩展目标C

感谢

+0

哪里寻找这些文件,会阻止您寻找在大多数地方? – trojanfoe

+0

我想搜索NSDocumentDirectory中的文件。 –

+0

@AmjadKhan使用'NSFileManager'类。它可以返回指定目录中的所有文件名。 – 2013-01-01 12:09:56

回答

3

我还没有发现,我可以说是简单的做&,最后我不得不写我自己的代码来做到这一点的任何事情。我在这里张贴这个,因为也许有人找到这个帮助完整。

-(void)search{ 
@autoreleasepool { 
    NSString *baseDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    NSFileManager *defFM = [NSFileManager defaultManager]; 
    BOOL isDir = YES; 

     NSArray *fileTypes = [[NSArray alloc] initWithObjects:@"mp3",@"mp4",@"avi",nil]; 
     NSMutableArray *mediaFiles = [self searchfiles:baseDir ofTypes:fileTypes]; 
     NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
     NSString *filePath = [docDir stringByAppendingPathComponent:@"playlist.plist"]; 
     if(![defFM fileExistsAtPath:filePath isDirectory:&isDir]){ 
      [defFM createFileAtPath:filePath contents:nil attributes:nil]; 
     } 

     NSMutableDictionary *playlistDict = [[NSMutableDictionary alloc]init]; 
     for(NSString *path in mediaFiles){ 
      NSLog(@"%@",path); 
      [playlistDict setValue:[NSNumber numberWithBool:YES] forKey:path]; 
     } 

     [playlistDict writeToFile:filePath atomically:YES]; 

     [[NSNotificationCenter defaultCenter] postNotificationName:@"refreshplaylist" object:nil]; 
    } 

} 

现在给定的应用程序沙箱递归方法

-(NSMutableArray*)searchfiles:(NSString*)basePath ofTypes:(NSArray*)fileTypes{ 
    NSMutableArray *files = [[[NSMutableArray alloc]init] autorelease]; 
    NSFileManager *defFM = [NSFileManager defaultManager]; 
    NSError *error = nil; 
    NSArray *dirPath = [defFM contentsOfDirectoryAtPath:basePath error:&error]; 
    for(NSString *path in dirPath){ 
     BOOL isDir; 
     path = [basePath stringByAppendingPathComponent:path]; 
     if([defFM fileExistsAtPath:path isDirectory:&isDir] && isDir){ 
      [files addObjectsFromArray:[self searchfiles:path ofType:fileTypes]]; 
     } 
    } 


    NSArray *mediaFiles = [dirPath pathsMatchingExtensions:fileTypes]; 
    for(NSString *fileName in mediaFiles){ 
     fileName = [basePath stringByAppendingPathComponent:fileName]; 
     [files addObject:fileName]; 
    } 

    return files; 
} 
6

看到使用NSFileManager你可以得到的文件和波纹管的条件与你能得到特别的扩展,它在文档目录的工作文件..

-(NSArray *)findFiles:(NSString *)extension 
{ 
    NSMutableArray *matches = [[NSMutableArray alloc]init]; 
    NSFileManager *manager = [NSFileManager defaultManager]; 

    NSString *item; 
    NSArray *contents = [manager contentsOfDirectoryAtPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] error:nil]; 
    for (item in contents) 
    { 
     if ([[item pathExtension]isEqualToString:extension]) 
     { 
      [matches addObject:item]; 
     } 
    } 

    return matches; 
} 

使用这个数组与搜索文件..获得NSArray类型的返回,以便使用NSArray对象来存储这些数据...

我希望这对您有所帮助...

+0

@AmjadKhan也看到此链接http://stackoverflow.com/questions/11646325/get-files-inside-a-folder-in-document-directory-in-iphone –

+1

感谢您的回复,但我知道这与我也问题是我有多个目录和子目录。如果我这样做,它可能需要一点时间来处理所有文件。我正在寻找更快的东西。 –

+0

@AmjadKhan看到这个链接http://stackoverflow.com/questions/1567134/how-can-i-get-a-writable-path-on-the-iphone,你也可以改变字典名称,也是设置你需要的路径只是试试吧.. –

1

是的,我们有直接的方法,下面的NSArray帮助你

NSMutableArray *arrayFiles = [[NSMutableArray alloc] initWithObjects:@"a.png", @"a.jpg", @"a.pdf", @"h.png", @"f.png", nil]; 
    NSLog(@"pathsMatchingExtensions----%@",[arrayFiles pathsMatchingExtensions:[NSArray arrayWithObjects:@"png", nil]]); 

//my output is 
"a.png", 
"h.png", 
"f.png" 
1

喜欢这种方式,您可以找到您的特定文件扩展名

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; 
    NSFileManager *manager = [NSFileManager defaultManager]; 
    NSDirectoryEnumerator *direnum = [manager enumeratorAtPath:bundleRoot]; 

    NSString *filename; 

    while ((filename = [direnum nextObject])) { 


     if ([filename hasSuffix:@".doc"]) { //change the suffix to what you are looking for 


      [arrayListofFileName addObject:[filename stringByDeletingPathExtension]]; 


     } 

    } 
3

你需要的是一个递归方法,这样就可以处理子目录。以下第一种方法是公开的;另一个私人。想象自己被实现为称为类的静态方法CocoaUtil

CocoaUtil.h:

@interface CocoaUtil : NSObject 

+ (NSArray *)findFilesWithExtension:(NSString *)extension 
          inFolder:(NSString *)folder; 

@end 

CocoaUtil.m:

// Private Methods 
@interface CocoaUtil() 

+ (NSArray *)_findFilesWithExtension:(NSString *)extension 
          inFolder:(NSString *)folder 
         andSubFolder:(NSString *)subFolder; 

@end 

@implementation CocoaUtil 

+ (NSArray *)findFilesWithExtension:(NSString *)extension 
          inFolder:(NSString *)folder 
{ 
    return [CocoaUtil _findFilesWithExtension:extension 
            inFolder:folder 
           andSubFolder:nil]; 
} 

+ (NSArray *)_findFilesWithExtension:(NSString *)extension 
          inFolder:(NSString *)folder 
         andSubFolder:(NSString *)subFolder 
{ 
    NSMutableArray *found = [NSMutableArray array]; 
    NSString *fullPath = (subFolder != nil) ? [folder stringByAppendingPathComponent:subFolder] : folder; 

    NSFileManager *fileman = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *contents = [fileman contentsOfDirectoryAtPath:fullPath error:&error]; 
    if (contents == nil) 
    { 
     NSLog(@"Failed to find files in folder '%@': %@", fullPath, [error localizedDescription]); 
     return nil; 
    } 

    for (NSString *file in contents) 
    { 
     NSString *subSubFolder = subFolder != nil ? [subFolder stringByAppendingPathComponent:file] : file; 
     fullPath = [folder stringByAppendingPathComponent:subSubFolder]; 

     NSError *error = nil; 
     NSDictionary *attributes = [fileman attributesOfItemAtPath:fullPath error:&error]; 
     if (attributes == nil) 
     { 
      NSLog(@"Failed to get attributes of file '%@': %@", fullPath, [error localizedDescription]); 
      continue; 
     } 

     NSString *type = [attributes objectForKey:NSFileType]; 

     if (type == NSFileTypeDirectory) 
     { 
      NSArray *subContents = [CocoaUtil _findFilesWithExtension:extension inFolder:folder andSubFolder:subSubFolder]; 
      if (subContents == nil) 
       return nil; 
      [found addObjectsFromArray:subContents]; 
     } 
     else if (type == NSFileTypeRegular) 
     { 
      // Note: case sensitive comparison! 
      if ([[fullPath pathExtension] isEqualToString:extension]) 
      { 
       [found addObject:fullPath]; 
      } 
     } 
    } 

    return found; 
} 

@end 

这将返回一个包含完整路径的每一个数组文件与指定的文件扩展名。需要注意的是[NSString pathExtension]不返回文件扩展名的.所以一定不要通过,在extension参数。

+0

用NSArray替换NSArray * subContents = ...... line subContents = [CocoaUtil _findFilesWithExtension:extension inFolder:folder andSubFolder:subSubFolder]; 它工作正常。谢谢! – Vrasidas

1

使用下面的代码

NSArray *myFiles = [myBundle pathsForResourcesOfType:@"Your File extension" 
            inDirectory:nil];