1

我正在尝试将下载的文件复制到应用程序文档目录中的特定文件夹,但似乎无法正常工作。我正在使用的代码是:

NSString *itemPathString = @"http://pathToFolder/folder/myFile.doc";
NSURL *myUrl = [NSURL URLWithString:itemPathString];

NSArray *paths = [fm URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];

NSURL *folderPath = [[paths objectAtIndex:0] URLByAppendingPathComponent:@"folder"];
NSURL *itemURL = [documentsPath URLByAppendingPathComponent:@"myFile.doc"];

// copy to documents directory asynchronously
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    NSFileManager *theFM = [[NSFileManager alloc] init];
    NSError *error;
    [theFM copyItemAtURL:myUrl toURL:itemURL error:&error];
    }
});

我可以正常检索文件,但无法复制它。谁能告诉我上面的代码有什么问题吗?

4

3 回答 3

3

如果从服务器下载文件,如果它是一个相当小的文件(例如,以 kb 为单位,而不是 mb),您可以使用dataWithContentsOfURL. 您可以使用该方法将文件加载到内存中,然后使用NSData实例方法writeToFile保存文件。

但是,如果它是一个较大的文件,您将需要使用NSURLConnection,它不会尝试将整个文件保存在内存中,而是在适当的时候将其写入文件系统。但是,这里的技巧是,如果您想下载多个文件,则必须按顺序下载它们,或者封装它们,NSURLConnection这样NSOutputStream您就可以为每个同时下载的文件提供单独的副本。

我已经上传了一个项目,下载管理器,它演示了NSURLConnection实现的样子,但这并不简单。您可能更愿意考虑使用已建立的第三方库,例如ASIHTTPRequestRestKit

于 2012-11-13T16:31:23.293 回答
3

如果要访问具有给定名称的文件夹,则应检查它是否存在,如果不存在则创建它。这可以很容易地做到这一点:

NSString *folder = [documentsPath stringByAppendingPathComponent:folderName];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = nil;
if (![fileManager fileExistsAtPath:folder]) {
    [fileManager createDirectoryAtPath:folder withIntermediateDirectories:YES attributes:nil error:&error];
}
if (error != nil) {
    NSLog(@"Some error: %@", error);
    return;
}

编辑

如果您想检查文件夹是否在您的设备上正确创建,请转到 Organizer -> Devices -> [YourDevelopingDeviceWhereTheAppWasInstalled] -> Applications -> [YourApplication]

在下半部分,您至少应该看到一些文件夹,例如 Documents。如果成功,您创建的文件夹也是如此。

在此处输入图像描述

于 2012-11-13T16:44:14.990 回答
1

您需要在复制文件之前创建任何中间目录。检查 Simulator 文件夹以查看是否在应用程序 Documents 文件夹中创建了“文件夹”目录。

模拟器路径是 /Users/$username/Library/Application Support/iPhone Simulator/

于 2012-11-13T16:00:17.020 回答