【问题标题】:Get file path by file name from documents directory ios从文档目录 ios 按文件名获取文件路径
【发布时间】:2014-07-09 23:05:41
【问题描述】:

在我的应用程序中,我下载了存储在不同子文件夹下的“文档”目录中的 PDF 文件。

现在我有了文件名,我想在“文档”目录中获取其路径,但问题是我不知道存储该文件的确切子文件夹。

那么有没有什么方法可以按文件名给出文件路径,就像有一种方法适用于主包:

(NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension

我不想遍历每个文件夹,这是一种乏味的方式。

谢谢。

【问题讨论】:

  • 见 Abhi 的回答。编程通常涉及编写大量注重细节的代码,但这并不是一大堆代码。

标签: ios objective-c nsfilemanager nsbundle


【解决方案1】:

您可以像这样搜索文档目录:

NSString *searchFilename = @"hello.pdf"; // name of the PDF you are searching for

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSDirectoryEnumerator *direnum = [[NSFileManager defaultManager] enumeratorAtPath:documentsDirectory];

NSString *documentsSubpath;
while (documentsSubpath = [direnum nextObject])
{
  if (![documentsSubpath.lastPathComponent isEqual:searchFilename]) {
    continue;
  }

  NSLog(@"found %@", documentsSubpath);
}

编辑:

您也可以使用 NSPredicate。如果文档目录中有数千个文件,则可能会因内存不足而崩溃。

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.lastPathComponent == %@", searchFilename];
NSArray *matchingPaths = [[[NSFileManager defaultManager] subpathsAtPath:documentsDirectory] filteredArrayUsingPredicate:predicate];

NSLog(@"%@", matchingPaths);

【讨论】:

  • thanx,看来除了搜索所有可能的路径别无选择。
  • @ViruMax 还有其他选择。例如,您可以获取每个子路径(文件管理器有一个supbathsAtPath: 方法),然后使用谓词(@"self.lastPathComponent == %@", searchFilename)过滤返回的数组。但老实说,最好只枚举所有目录。代码不多。跨度>
  • 查看我更新的答案以获取 NSPredicate 的示例。
【解决方案2】:

Swift 2.2 非常简单:

let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first! as NSString
let plistPath = paths.stringByAppendingPathComponent("someFile.plist")

【讨论】:

  • 这个答案没有解决问题中给出的问题,如果文档目录下有很多子文件夹怎么办,这种情况下这个逻辑不起作用。
【解决方案3】:

你必须走树才能找到文件; ~/Documents 目录中没有与 -pathForResource:ofType 等效的功能。

【讨论】:

  • 意味着必须尝试所有可能的路径
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 2015-10-29
  • 2023-03-26
相关资源
最近更新 更多