【问题标题】:Is it possible to glob a directory in iOS and have the results cached by the OS?是否可以在 iOS 中全局化一个目录并让操作系统缓存结果?
【发布时间】:2012-10-02 18:33:50
【问题描述】:

在 iOS 上使用NSFileManager 和较低级别的 API 从文件系统读取的许多方法都涉及内置缓存,因此即使目录中有很多项目,从未更改的目录读取也可以非常快。

我有一种情况,我希望能够使用 glob 枚举目录中的文件:

即该文件夹的文件名称如下:

1-1-0.png
1-2-0.png
1-3-0.png
1-3-1.png
2-2-1.png
5-1-1.png
5-1-2.png
5-2-1.png
5-3-0.png
6-1-1.png
...
1501-5-2.png

我可能想要获取与5-*-1.png 匹配的所有文件名,这将返回5-1-1.png5-2-1.png

加载整个目录列表然后在 RAM 中进行 globbing 非常简单,但是有没有一种方法可以在 OS 级别执行此操作,它会内置缓存,因此重复调用同一个 glob 会缓存(更快) 结果?

【问题讨论】:

    标签: objective-c ios file-io nsfilemanager glob


    【解决方案1】:

    您可以使用glob() 函数,如以下要点中所述:https://gist.github.com/bkyle/293959

    #include <glob.h> 
    
    + (NSArray*) arrayWithFilesMatchingPattern: (NSString*) pattern inDirectory: (NSString*) directory { 
      NSMutableArray* files = [NSMutableArray array];
      glob_t gt;
      NSString* globPathComponent = [NSString stringWithFormat: @"/%@", pattern];
      NSString* expandedDirectory = [directory stringByExpandingTildeInPath];
      const char* fullPattern = [[expandedDirectory stringByAppendingPathComponent: globPathComponent] UTF8String];
      if (glob(fullPattern, 0, NULL, &gt) == 0) {
          int i;
          for (i=0; i<gt.gl_matchc; i++) {
              size_t len = strlen(gt.gl_pathv[i]);
              NSString* filename = [[NSFileManager defaultManager] stringWithFileSystemRepresentation: gt.gl_pathv[i] length: len];
              [files addObject: filename];
          }
      }
      globfree(&gt);
      return [NSArray arrayWithArray: files];
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-26
      • 2015-11-06
      • 2016-02-23
      • 2012-11-12
      • 2011-12-31
      • 1970-01-01
      • 2017-04-17
      • 2015-05-16
      • 1970-01-01
      相关资源
      最近更新 更多