当前位置:  开发笔记 > IOS > 正文

使用glob获取目录中的文件列表

如何解决《使用glob获取目录中的文件列表》经验,为你挑选了6个好方法。

出于某些疯狂的原因,我无法找到一种方法来获取给定目录的带有glob的文件列表.

我目前仍然坚持以下几点:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] 
                        directoryContentsAtPath:bundleRoot];

..然后剥掉我不想要的东西,这很糟糕.但我真正喜欢的是能够搜索"foo*.jpg"之类的东西,而不是要求整个目录,但我找不到那样的东西.

那你怎么做的呢?



1> Brian Webste..:

你可以在NSPredicate的帮助下轻松实现这一点,如下所示:

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtPath:bundleRoot error:nil];
NSPredicate *fltr = [NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"];
NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr];

如果您需要使用NSURL而不是它,它看起来像这样:

NSURL *bundleRoot = [[NSBundle mainBundle] bundleURL];
NSArray * dirContents = 
      [fm contentsOfDirectoryAtURL:bundleRoot
        includingPropertiesForKeys:@[] 
                           options:NSDirectoryEnumerationSkipsHiddenFiles
                             error:nil];
NSPredicate * fltr = [NSPredicate predicateWithFormat:@"pathExtension='jpg'"];
NSArray * onlyJPGs = [dirContents filteredArrayUsingPredicate:fltr];


刚刚继续更新代码示例以使用contentsOfDirectoryAtPath:error:而不是directoryContentsAtPath:
是的,你可以使用OR语句添加额外的逻辑,例如"self ENDSWITH'jpg'或self ENDSWITH'.png'"
您可以使用"pathExtension =='.xxx'"而不是"ENDSWITH".看看这个[答案](http://stackoverflow.com/questions/5032541/nspredicate-endswith-multiple-files)
自iOS 2.0起,不推荐使用directoryContentsAtPath.这个问题+答案太旧了......
这太棒了......我一直在用其他方法捣乱一整天了!大.主要技巧是知道在StackO上搜索什么!

2> Matt..:

这非常适合IOS,但也应该适用cocoa.

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

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

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

        // Do work here
        NSLog(@"Files in resource folder: %@", filename);            
    }       
}



3> John Biesnec..:

那么使用NSString的hasSuffix和hasPrefix方法呢?类似的东西(如果你正在搜索"foo*.jpg"):

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
NSArray *dirContents = [[NSFileManager defaultManager] directoryContentsAtPath:bundleRoot];
for (NSString *tString in dirContents) {
    if ([tString hasPrefix:@"foo"] && [tString hasSuffix:@".jpg"]) {

        // do stuff

    }
}

对于简单,直接的匹配,它比使用正则表达式库更简单.



4> Rajesh Logan..:

非常简单的方法:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

NSFileManager *manager = [NSFileManager defaultManager];
NSArray *fileList = [manager contentsOfDirectoryAtPath:documentsDirectory 
                                                 error:nil];
//--- Listing file by name sort
NSLog(@"\n File list %@",fileList);

//---- Sorting files by extension    
NSArray *filePathsArray = 
  [[NSFileManager defaultManager] subpathsOfDirectoryAtPath:documentsDirectory  
                                                      error:nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF EndsWith '.png'"];
filePathsArray =  [filePathsArray filteredArrayUsingPredicate:predicate];
NSLog(@"\n\n Sorted files by extension %@",filePathsArray);



5> Bryan Kyle..:

Unix有一个可以为你执行文件通配操作的库.函数和类型在名为的头中声明glob.h,因此您需要#include它.如果打开一个终端,打开glob的手册页,键入man 3 glob你将获得使用这些函数你需要知道的所有信息.

下面是如何在数组中填充与globbing模式匹配的文件的示例.使用此glob功能时,您需要记住一些事项.

    默认情况下,该glob函数在当前工作目录中查找文件.为了搜索另一个目录,您需要将目录名称添加到globbing模式,就像我在我的示例中所做的那样,以获取所有文件/bin.

    您负责在完成结构后glob通过调用来清理分配的内存globfree.

在我的示例中,我使用默认选项,没有错误回调.手册页涵盖了所有选项,以防您想要使用其中的某些内容.如果您打算使用上面的代码,我建议将其添加为类别NSArray或类似内容.

NSMutableArray* files = [NSMutableArray array];
glob_t gt;
char* pattern = "/bin/*";
if (glob(pattern, 0, NULL, >) == 0) {
    int i;
    for (i=0; i

编辑:我在github上创建了一个要点,其中包含一个名为NSArray + Globbing的类别中的上述代码.



6> Mark..:

您需要使用自己的方法来消除不需要的文件.

使用内置工具并不容易,但您可以使用RegExKit Lite来帮助查找您感兴趣的返回数组中的元素.根据发行说明,这应该适用于Cocoa和Cocoa-Touch应用程序.

这是我在大约10分钟内编写的演示代码.我将<和>更改为"因为它们没有出现在pre块中,但它仍然适用于引号.也许在StackOverflow上有更多关于格式化代码的人会纠正这个(Chris?).

这是一个"基础工具"命令行实用程序模板项目.如果我在我的家庭服务器上启动并运行我的git守护程序,我将编辑此帖子以添加项目的URL.

#import "Foundation/Foundation.h"
#import "RegexKit/RegexKit.h"

@interface MTFileMatcher : NSObject 
{
}
- (void)getFilesMatchingRegEx:(NSString*)inRegex forPath:(NSString*)inPath;
@end

int main (int argc, const char * argv[])
{
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // insert code here...
    MTFileMatcher* matcher = [[[MTFileMatcher alloc] init] autorelease];
    [matcher getFilesMatchingRegEx:@"^.+\\.[Jj][Pp][Ee]?[Gg]$" forPath:[@"~/Pictures" stringByExpandingTildeInPath]];

    [pool drain];
    return 0;
}

@implementation MTFileMatcher
- (void)getFilesMatchingRegEx:(NSString*)inRegex forPath:(NSString*)inPath;
{
    NSArray* filesAtPath = [[[NSFileManager defaultManager] directoryContentsAtPath:inPath] arrayByMatchingObjectsWithRegex:inRegex];
    NSEnumerator* itr = [filesAtPath objectEnumerator];
    NSString* obj;
    while (obj = [itr nextObject])
    {
        NSLog(obj);
    }
}
@end

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有