在Objective-C / cocoa中创build文件夹/目录

我有这个代码在Objective-C / cocoa中创build一个文件夹/目录

if(![fileManager fileExistsAtPath:directory isDirectory:&isDir]) if(![fileManager createDirectoryAtPath:directory attributes:nil]) NSLog(@"Error: Create folder failed %@", directory); 

它工作正常,但我得到了creatDirectoryAtPath:attributes is deprecated警告消息。 在Cocoa / Objective-c中制作目录生成器的最新方法是什么?

解决了

 BOOL isDir; NSFileManager *fileManager= [NSFileManager defaultManager]; if(![fileManager fileExistsAtPath:directory isDirectory:&isDir]) if(![fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:NULL]) NSLog(@"Error: Create folder failed %@", directory); 

4 Solutions collect form web for “在Objective-C / cocoa中创build文件夹/目录”

在find的文档中约30秒:

-[NSFileManager createDirectoryAtPath:withIntermediateDirectories:attributes:error:]

你的解决scheme是正确的,尽pipeApple在NSFileManager.h包含了一个重要的注意NSFileManager.h

 /* The following methods are of limited utility. Attempting to predicate behavior based on the current state of the filesystem or a particular file on the filesystem is encouraging odd behavior in the face of filesystem race conditions. It's far better to attempt an operation (like loading a file or creating a directory) and handle the error gracefully than it is to try to figure out ahead of time whether the operation will succeed. */ - (BOOL)fileExistsAtPath:(NSString *)path; - (BOOL)fileExistsAtPath:(NSString *)path isDirectory:(BOOL *)isDirectory; - (BOOL)isReadableFileAtPath:(NSString *)path; - (BOOL)isWritableFileAtPath:(NSString *)path; - (BOOL)isExecutableFileAtPath:(NSString *)path; - (BOOL)isDeletableFileAtPath:(NSString *)path; 

实质上,如果多个线程/进程同时修改文件系统,则状态可能会在调用fileExistsAtPath:isDirectory:和调用createDirectoryAtPath:withIntermediateDirectories:之间发生变化,因此在此上下文中调用fileExistsAtPath:isDirectory:是多余的,可能是危险的。

为了您的需要,并且在您的问题的有限范围内,这可能不会成为问题,但是下面的解决scheme既简单又不太可能产生未来问题:

 NSFileManager *fileManager= [NSFileManager defaultManager]; NSError *error = nil; if(![fileManager createDirectoryAtPath:directory withIntermediateDirectories:YES attributes:nil error:&error]) { // An error has occurred, do something to handle it NSLog(@"Failed to create directory \"%@\". Error: %@", directory, error); } 

还要注意苹果的文档 :

返回值

如果该目录已创build,则为YES;如果设置了createIntermediates且该目录已存在,则为YES;如果发生错误,则为NO。

因此,将createIntermediates设置为YES ,您事实上已经检查了该目录是否已经存在。

我想添加到这里,并从有关使用+ defaultManager方法的文档中提到更多:

在iOS和Mac OS X v 10.5及更高版本中,您应该考虑使用[[NSFileManager alloc] init]而不是单例方法defaultManager。 NSFileManager的实例在使用[[NSFileManager alloc] init]创build时被认为是线程安全的。

您可能更喜欢使用NSFileManager方法:

createDirectoryAtURL:withIntermediateDirectories:attributes:error:

它使用URL而不是pathstring。

  • Facebook iOS8 SDK为FBSDKCoreKit构build模块错误
  • 如何添加在Objective-C中有自己的UIViewController的子视图?
  • 有没有办法要求用户访问相机访问后,他们已经否认了iOS 8?
  • 从UIColor获得稍微更亮和更深的颜色
  • 在iOS 7上运行应用程序时显示黑条(4英寸视网膜显示)
  • 详细披露之后的注解细节被按下了吗
  • 如何通过故事板加载视图初始化?
  • 在Objective-C中检查空string的正确方法是什么?
  • 如何对NSArray进行自然sorting?
  • 将毫秒转换为NSDate
  • 在我滚动之前,数据不会在UITableView中加载