NSFileManager - URLsForDirectory ...或URLForDirectory

ede*_*y05 5 nsfilemanager ios

-[NSFileManager URLForDirectory:inDomain:appropriateForURL:create:error:]需要单个NSSearchPathDomainMask并返回单个URL.(该...appropriateForURL:create:error:部分在文档中有点令人困惑.)

-[NSFileManager URLsForDirectory:inDomains:] 允许您为domains参数创建位掩码并返回URL数组.

在我看来,这两种方法之间存在重叠.如果我的目标是从iOS应用程序的沙箱中获取Documents,或Library或etc目录,我何时应该使用另一个?

rma*_*ddy 17

访问Documents目录(或其他类似目录)的标准方法是如下代码:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = paths[0];
Run Code Online (Sandbox Code Playgroud)

这类似于:

NSArray *URLs = [[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];
NSURL *documentsURL = URLs[0];
Run Code Online (Sandbox Code Playgroud)

关键的区别在于,第一个为您提供路径,NSString而第二个为您提供路径NSURL.

另一种方法可以通过以下方式使用:

NSURL *documentsURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
Run Code Online (Sandbox Code Playgroud)

您可以传递NODocuments目录,因为它始终存在.您应该传递YES应用程序支持目录,因为它默认不存在.理想情况下,您不应该传入nil错误,这样您就可以看到方法调用返回时发生了什么nil.

这三种方法都有效.如果您希望路径为字符串,请使用1st.如果您希望将其作为URL,请使用第3个.如果您很少需要传递多个域,请使用第二个.

  • 从Apple的文档:`您应该考虑使用NSFileManager方法URLForDirectory:inDomains:和URLForDirectory:inDomain:properForURL:create:error:.返回URL,这是首选格式 (4认同)
  • @Hulvej来自`NSFileManager`的文档:`可以安全地从多个线程调用共享NSFileManager对象的方法.如果需要使用`NSFileManagerDelegate`方法,建议创建自己的`NSFileManager`实例. (3认同)