【问题标题】:Create a folder inside documents folder in iOS apps在 iOS 应用程序的文档文件夹中创建一个文件夹
【发布时间】:2010-12-18 06:47:51
【问题描述】:

我只想在我的 iPhone 应用程序的文档文件夹中创建新文件夹。

有人知道怎么做吗?

感谢您的帮助!

【问题讨论】:

    标签: iphone directory new-operator document nsfilemanager


    【解决方案1】:

    我这样做的方式如下:

    NSError *error;
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Get documents folder
    NSString *dataPath = [documentsDirectory stringByAppendingPathComponent:@"/MyFolder"];
    
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder
    

    【讨论】:

    • 感谢您的回复,它可以工作,但它会在应用程序的文档文件夹旁边创建文件夹“MyFolder”......而不是在其中。不知道为什么
    • 抱歉 - 有错字 - 必须将 @"/MyFolder",而不是 @"MyFolder" 附加到文档路径。
    • 您可能希望将第三行更改为 NSString *dataPath = [documentsDirectory stringByAppendingString:@"/MyFolder"];因为 NSSearchPathForDirectoriesInDomains 不返回斜杠。
    • 我修复了代码以使用更正确的“stringByAppendingPathComponent”,无论输入字符串是否有“/”,它都能正确执行。
    • 帮了我很多.. 谢谢弗拉基米尔
    【解决方案2】:

    我不喜欢“[paths objectAtIndex:0]”,因为如果 Apple 添加一个以“A”、“B”或“C”开头的新文件夹,则“Documents”文件夹不是第一个文件夹目录。

    更好:

    NSString *dataPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/MyFolder"];
    if (![[NSFileManager defaultManager] fileExistsAtPath:dataPath])
        [[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]; //Create folder
    

    【讨论】:

    • 见蒂姆的回答。使用 NSSearchPathForDirectoryiesInDomains 是检索用户文档目录的标准方法。
    • 如果 Apple 决定将 Documents 目录重命名为“MyDocuments”(或类似名称),您的方法也不会奏效。
    【解决方案3】:

    我没有足够的声誉来评论 Manni 的回答,但是 [paths objectAtIndex:0] 是获取应用程序文档目录的标准方式

    http://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/StandardBehaviors/StandardBehaviors.html#//apple_ref/doc/uid/TP40007072-CH4-SW6

    因为 NSSearchPathForDirectoriesInDomains 函数最初是为 Mac OS X,可能还有更多 不是这些目录中的一个, 它返回一个路径数组,而不是 而不是一条路径。在 iOS 中, 结果数组应包含 目录的单一路径。清单 图 3-1 显示了此方法的典型用法 功能。

    清单 3-1 获取路径 应用程序的 Documents 目录

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

    【讨论】:

    • 我认为最简单的获取文档目录路径的方法是:NSString* path = [@"~/Documents" stringByExpandingTildeInPath];
    【解决方案4】:

    这对我来说很好用,

    NSFileManager *fm = [NSFileManager defaultManager];
    NSArray *appSupportDir = [fm URLsForDirectory:NSDocumentsDirectory inDomains:NSUserDomainMask];
    NSURL* dirPath = [[appSupportDir objectAtIndex:0] URLByAppendingPathComponent:@"YourFolderName"];
    
    NSError*    theError = nil; //error setting
    if (![fm createDirectoryAtURL:dirPath withIntermediateDirectories:YES
                               attributes:nil error:&theError])
    {
       NSLog(@"not created");
    }
    

    【讨论】:

    • 应该是 NSDocumentDirectory 而不是 NSDocumentsDirectory
    【解决方案5】:

    以下代码可能有助于创建目录:

    -(void) createDirectory : (NSString *) dirName {
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0]; // Fetch path for document directory
    dataPath = (NSMutableString *)[documentsDirectory stringByAppendingPathComponent:dirName];
    
    NSError *error;
    
    if (![[NSFileManager defaultManager] createDirectoryAtPath:dataPath withIntermediateDirectories:NO attributes:nil error:&error]) {
        NSLog(@"Couldn't create directory error: %@", error);
    }
    else {
        NSLog(@"directory created!");
    }
    
    NSLog(@"dataPath : %@ ",dataPath); // Path of folder created
    
    }
    

    用法:

    [self createDirectory:@"MyFolder"];
    

    结果:

    目录已创建!

    数据路径:/var/mobile/Applications/BD4B5566-1F11-4723-B54C-F1D0B23CBC/Documents/MyFolder

    【讨论】:

      【解决方案6】:

      Swift 1.2 和 iOS 8

      在文档目录中创建自定义目录 (name = "MyCustomData"),但前提是该目录不存在。

      // path to documents directory
      let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first as! String
      
      // create the custom folder path
      let myCustomDataDirectoryPath = documentDirectoryPath.stringByAppendingPathComponent("/MyCustomData")
      
      // check if directory does not exist
      if NSFileManager.defaultManager().fileExistsAtPath(myCustomDataDirectoryPath) == false {
      
          // create the directory
          var createDirectoryError: NSError? = nil
          NSFileManager.defaultManager().createDirectoryAtPath(myCustomDataDirectoryPath, withIntermediateDirectories: false, attributes: nil, error: &createDirectoryError)
      
          // handle the error, you may call an exception
          if createDirectoryError != nil {
              println("Handle directory creation error...")
          }
      
      }
      

      【讨论】:

        【解决方案7】:

        Swift 2 解决方案:

        let documentDirectoryPath: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
        if !NSFileManager.defaultManager().fileExistsAtPath(documentDirectoryPath) {
                do {
                    try NSFileManager.defaultManager().createDirectoryAtPath(documentDirectoryPath, withIntermediateDirectories: false, attributes: nil)
        
                } catch let createDirectoryError as NSError {
                    print("Error with creating directory at path: \(createDirectoryError.localizedDescription)")
                }
        
            }
        

        【讨论】:

          【解决方案8】:

          Swift 3 解决方案:

          private func createImagesFolder() {
                  // path to documents directory
                  let documentDirectoryPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
                  if let documentDirectoryPath = documentDirectoryPath {
                      // create the custom folder path
                      let imagesDirectoryPath = documentDirectoryPath.appending("/images")
                      let fileManager = FileManager.default
                      if !fileManager.fileExists(atPath: imagesDirectoryPath) {
                          do {
                              try fileManager.createDirectory(atPath: imagesDirectoryPath,
                                                              withIntermediateDirectories: false,
                                                              attributes: nil)
                          } catch {
                              print("Error creating images folder in documents dir: \(error)")
                          }
                      }
                  }
              }
          

          【讨论】:

            【解决方案9】:

            Swift 4.0

            let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
            // Get documents folder
            let documentsDirectory: String = paths.first ?? ""
            // Get your folder path
            let dataPath = documentsDirectory + "/yourFolderName"
            if !FileManager.default.fileExists(atPath: dataPath) {
                // Creates that folder if not exists
                try? FileManager.default.createDirectory(atPath: dataPath, withIntermediateDirectories: false, attributes: nil)
            }
            

            【讨论】:

            • 如何将数据写入新创建的目录?
            猜你喜欢
            • 2019-07-14
            • 2012-02-22
            • 1970-01-01
            • 1970-01-01
            • 2013-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多