【问题标题】:Unable to copy folder from application bundle to document directory无法将文件夹从应用程序包复制到文档目录
【发布时间】:2014-03-27 15:12:51
【问题描述】:

我正在尝试将文件夹从应用程序包复制到 iphone 文档目录,但它没有发生。

我用过这个代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString *sourcePath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Photos"];


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

    NSError *error1;
    NSArray *resContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:sourcePath error: &error1];
    if (error1) {
        NSLog(@"error1 : %@",error1);
    }
    [resContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop)
     {
         NSError* error;
         if (![[NSFileManager defaultManager]
               copyItemAtPath:[sourcePath stringByAppendingPathComponent:obj]
               toPath:[documentsDirectory stringByAppendingPathComponent:obj]
               error:&error])
             NSLog(@"%@", [error localizedDescription]);
     }];
}

也试过这种方法

- (void)viewDidLoad{
     [self copyFolder];
    }

- (void) copyFolder {
    BOOL success1;
    NSFileManager *fileManager1 = [NSFileManager defaultManager];
    fileManager1.delegate = self;
    NSError *error1;
    NSArray *paths1 = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory1 = [paths1 objectAtIndex:0];
    NSString *writableDBPath1 = [documentsDirectory1 stringByAppendingPathComponent:@"/Photos"];

    if (![[NSFileManager defaultManager] fileExistsAtPath:writableDBPath1])
        [[NSFileManager defaultManager] createDirectoryAtPath:writableDBPath1 withIntermediateDirectories:NO attributes:nil error:&error1];

    NSString *defaultDBPath1 = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Photos"];
    NSLog(@"default path %@",defaultDBPath1);
    success1 = [fileManager1 copyItemAtPath:defaultDBPath1 toPath:writableDBPath1 error:&error1];
    if (!success1 )
    {
        NSLog(@"error1 : %@",error1);
    } else {
    }
}

- (BOOL)fileManager:(NSFileManager *)fileManager shouldProceedAfterError:(NSError *)error copyingItemAtPath:(NSString *)srcPath toPath:(NSString *)dstPath{
    if ([error code] == 516) //error code for: The operation couldn’t be completed. File exists
        return YES;
    else
        return NO;
}

显示这个错误

Error Domain=NSCocoaErrorDomain Code=260 "操作无法完成。(Cocoa 错误 260。)" UserInfo=0x8a39800 {NSUnderlyingError=0x8a385b0 "操作无法完成。没有这样的文件或目录", NSFilePath =/Users/user/Library/Application Support/iPhone Simulator/7.0.3/Applications/FC7F93EE-CFB7-41CF-975B-2E3B18760202/app.app/Photos, NSUserStringVariant=( 文件夹 )}

但这是文件夹

【问题讨论】:

  • 黄色照片代表组名。物理文件夹为蓝色。
  • 注意项目中的“照片”不是真正的文件夹而是组(例如Images.xcassets是真正的文件夹)
  • @user523234thanx 回复得到它。
  • @proff thanx 回复得到它

标签: ios iphone nsfilemanager


【解决方案1】:

照片 看起来像一个组,而不是文件夹引用。因此,所有图像photo1.jpg.. 等都直接存储在您的资源包下。

路径<resource_bundle>/Photos 不存在。要验证这一点,请转到应用程序.app

.app->Right-click->Show Package Contents

不要将照片添加为组,而是将其添加为文件夹引用并在您的目标下复制捆绑资源确保添加了整个文件夹。

希望有帮助!

【讨论】:

  • 感谢您的回复。我今天学到了新东西。也感谢 user523234 proff。
【解决方案2】:

您的照片不在照片目录中。它们只存在于/Users/devubhamanek/Library/Application Support/iPhone Simulator/7.0.3/Applications/FC7F93EE-CFB7-41CF-975B-2E3B18760202/MTPhotoViewer.app/ 中,例如/Users/devubhamanek/Library/Application Support/iPhone Simulator/7.0.3/Applications/FC7F93EE-CFB7-41CF-975B-2E3B18760202/MTPhotoViewer.app/photo1.jpg

如果你想在 bundle 中创建一个目录,你应该像这样在 Photos 目录中添加文件: .

您的项目导航器中的文件夹应该是:

【讨论】:

    【解决方案3】:

    确保您的文件夹存在。 您可以轻松地将XCode 中的群组分配到物理文件夹

    点击group,您将在右侧窗格中找到位置设置。

    folder标志选择物理文件夹location

    实际上,这对于保持项目结构整洁(不仅在 XCode 项目中)而且在磁盘上物理上都非常有帮助。

    【讨论】:

      【解决方案4】:

      Swift 3 完整解决方案代码 注意:参考创建文件夹后使用以下方法。

      func copyFolderFromThisAppMainToUserDocument(folderName: String) -> Bool {
      
          let fileMgr = FileManager.default
          let userDocumentURL = fileMgr.urls(for: .documentDirectory, in: .userDomainMask).first!
          let urlForCopy = userDocumentURL.appendingPathComponent(folderName, isDirectory: true)
          if let bundleURL = Bundle.main.url(forResource: folderName, withExtension: "") {
              // if exist we will copy it
              do {
                  try fileMgr.copyItem(at: bundleURL, to: urlForCopy)
                  return true
              } catch let error as NSError { // Handle the error
                  print("\(folderName) copy failed! Error:\(error.localizedDescription)")
                  return false
              }
          } else {
              print("\(folderName) not exist in bundle folder")
              return false
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-05
        • 1970-01-01
        • 2012-01-03
        • 2011-09-05
        • 1970-01-01
        • 1970-01-01
        • 2016-03-24
        • 1970-01-01
        • 2016-09-04
        相关资源
        最近更新 更多