4

私はiPhoneプロジェクトでいくつかのファイル操作に取り組んでいます。特定の拡張子のファイルを検索する必要がある場合。1つのオプションは、各ファイルとディレクトリを手動で処理して検索することです。私の質問は、それを行う簡単な方法はありますか?

ありがとう

4

6 に答える 6

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

検索したファイルでこの配列を使用します。returnin型を取得するため、オブジェクトをNSArray使用してこのデータを格納します。NSArray

これがお役に立てば幸いです...

于 2013-01-01T12:13:32.777 に答える
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ください。

于 2013-01-02T13:13:13.490 に答える
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;
}
于 2013-01-04T06:12:00.017 に答える
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"
于 2013-01-01T12:51:50.887 に答える
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]];


        }

    }
于 2013-01-02T12:59:47.670 に答える
1

以下のコードを使用してください

NSArray *myFiles = [myBundle pathsForResourcesOfType:@"Your File extension"
                                    inDirectory:nil];
于 2013-11-25T10:27:48.010 に答える