将文件从Documents移动到tmp XCode 8 iOS 10

时间:2016-10-19 10:13:58

标签: ios xcode8 ios10 nsfilemanager

我正在将我的应用程序从 XCode7和iOS 9.x移植到XCode8和iOS10 。 我正在努力处理文件。

我需要从后端下载文件,然后将其从/Documents移至/tmp。这是我的代码:

    AFURLSessionManager *manager = ...

    NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
        NSURL *documentsDirectoryPath = [NSURL fileURLWithPath:[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]];
        return [documentsDirectoryPath URLByAppendingPathComponent:[response suggestedFilename]];
    } completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
        if(error) {
            ...
        } else {

            NSFileManager *fileManager = [NSFileManager defaultManager];

            NSError *error;
            NSString *tmpDirectory = NSTemporaryDirectory();
            NSString *tmpPDFPath = [tmpDirectory stringByAppendingPathComponent:[[response suggestedFilename] stringByReplacingOccurrencesOfString:@" " withString:@""]];

            if ([fileManager fileExistsAtPath:tmpPDFPath] == YES) {
                [fileManager removeItemAtPath:tmpPDFPath error:&error];
            }

            NSLog(@"readable %d", [fileManager isReadableFileAtPath:filePath]);
            // Print TRUE
            NSLog(@"tmpWritable %d", [fileManager isWritableFileAtPath:[NSURL URLWithString:tmpDirectory]]);
            // Print TRUE

            BOOL move = [fileManager moveItemAtPath:filePath toPath:tmpPDFPath error:&error];

            ...
        }
    }];

如果我在iOS 9.3模拟器中运行我的应用程序,一切正常,但在iOS10中运行时应用程序崩溃。 我必须做的第一个更改是传递给moveItemAtPath方法filePath.absoluteString而不是filePath。 尽管进行了这种编辑,但移动方法总是因此错误而失败:

  

错误Domain = NSCocoaErrorDomain Code = 4“”XXXX.pdf“无法移动到”tmp“,因为前者不存在,或者包含后者的文件夹不存在。“UserInfo = {NSSourceFilePathErrorKey = / file:/ Users / XXX / Library / Developer / CoreSimulator / Devices / 24CAB2B2-F495-4CFF-90A7-5C51AF38C194 / data / Containers / Data / Application / 3D8EEEF9-F639-4D6C-BD5E- 17A571F7B836 / Documents / XXXX.pdf,NSUserStringVariant =(       的移动   ),NSFilePath = / file:/ Users / XXXX / Library / Developer / CoreSimulator / Devices / 24CAB2B2-F495-4CFF-90A7-5C51AF38C194 / data / Containers / Data / Application / 3D8EEEF9-F639-4D6C-BD5E-17A571F7B836 / Documents / “XXXX.pdf,NSDestinationFilePath = / Users /”XXXX / Library / Developer / CoreSimulator / Devices / 24CAB2B2-F495-4CFF-90A7-5C51AF38C194 / data / Containers / Data / Application / 3D8EEEF9-F639-4D6C-BD5E-17A571F7B836 / tmp /"XXXX.pdf,NSUnderlyingError = 0x7b0a3500 {错误域= NSPOSIXErrorDomain代码= 2“没有这样的文件或目录”}}

有没有人处理过这种错误?

2 个答案:

答案 0 :(得分:3)

我的第一个解决方法是通过 NSData

 NSError* errorWrite = nil;
 NSData* data = [NSData dataWithContentsOfURL:filePath];
 BOOL write = [data writeToFile:tmpPDFPath options:NSDataWritingAtomic error:&errorWrite];

此代码工作正常,但我想了解为什么之前的代码没有。

答案 1 :(得分:1)

我遇到了同样的问题,我的解决方案是从3.0.15更新到最新版本的Dropbox SDK(目前为3.2.0)。特别是,我仍然以iOS 8.x为目标,所以我的CocoaPods更新没有获得更新版本的Dropbox,这个错误在版本3.0.18周围修复。有关详细信息,请参阅this forum QA