文件目录中没有显示文件?

时间:2011-03-19 10:09:07

标签: iphone objective-c cocoa-touch asihttprequest

我想将PDF下载到我的文档目录。 我是这样做的:

- (IBAction)grabURLInBackground:(id)sender
{

    NSURL *url = [NSURL URLWithString:@"http://www.test.com/test.pdf"];
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
    [request setDownloadDestinationPath:[self documentsDirectory]];
    [request setDelegate:self];
    [request startAsynchronous];

}

- (void)requestFinished:(ASIHTTPRequest *)request
{

    NSLog(@"requestFinished");
    NSError *error; 

    NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self documentsDirectory] error:&error];
    if (array == nil) {
       NSLog(@"array == nil");
    }
    NSLog(@"Array count: %d", [array count]);

}

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

但我的阵列总是空的,我不知道为什么......

它现在有效,制作了一个新项目并且有效。 有点奇怪。

2 个答案:

答案 0 :(得分:3)

这种情况正在发生,因为编写的代码实际上是用文件替换 Documents目录,而不是将其放在Documents目录中。

如果您查看Finder中的Simulator目录(〜/ Library / Application Support / iPhone Simulator / 4.3 / Applications / ...),您会看到如下内容: Documents directory replaced with downloaded file

注意下载完成后,Documents目录的“Kind”不再是“Folder”而是“Document”。

如果您将.pdf附加到Finder中的Documents文件,它应该是您下载的PDF。我尝试了你的代码,这就是它为我做的。您正在下载文件目录。

如果向下载路径添加显式文件名,则代码将起作用。所以像这样:

NSString *filePath = [[[self documentsDirectory] stringByAppendingPathComponent:@"localFile"] stringByAppendingPathExtension:@"pdf"]];
[request setDownloadDestinationPath:filePath];

如果您查看example in the HTTPRequest documentation,您将看到指定了文件路径,而不仅仅是下载目录。

作为旁注,您还应该实现- (void)requestFailed:(ASIHTTPRequest *)request委托方法,并在contentsOfDirectoryAtPath:数组为零时(在requestFinished:代码中)检查/打印出NSError。这样可以让您更轻松地追踪问题。

注意:确保在修复代码之前从模拟器中删除应用程序,否则当您尝试写入该文档目录时会出现错误,因为它现在不再是目录!

答案 1 :(得分:0)

我不确定你的dir变量来自哪里,但看起来这就是你的问题所在。

您可以正确返回数组:

NSArray *array = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:[self documentsDirectory] error:&error];

在我将数组分配给*array之前,我可以正确地记录您的数据,但之后您正在使用dir变量。也不需要分配FileManger对象,因为您可以像分配[NSFileManger defaultManager]时一样使用*array

另外,当你说你的数组是空的时,你的意思是nil并且你的数组== nil日志正在被触发,或者你正在使用[array count];并且它返回0?