传输正在进行时识别文件的完整大小

时间:2013-11-15 21:30:26

标签: ios cocoa-touch nsfilemanager

在我的iphone应用程序中,只要添加这些文件,我就会在表格视图中显示添加到文档目录的文件的信息。为此,我使用了apple中的一个示例代码中提供的DirectoryWatcher类。

以下是显示其用途的代码块:

- (void)viewDidLoad
{
    // start monitoring the document directory…
    self.aDirectoryWatcher = [DirectoryWatcher watchFolderWithPath:[self applicationDocumentsDirectory] delegate:self];

    // scan for existing documents
    [self directoryDidChange:self.aDirectoryWatcher];
}

- (void)directoryDidChange:(DirectoryWatcher *)folderWatcher
{
    [self reconcileData];
}

表格视图中显示的信息之一是文件大小,我将获得如下信息:

NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[fileURL path] error:nil];
NSNumber * size = [fileAttributes objectForKey:NSFileSize];

问题是 -

  

当我尝试添加大文件(例如电影文件)时,则为   它调用后立即开始传输(复制或移动操作)   directoryDidChange:立即。除非转移,否则它不会等待   完成了。所以我的大小总是为0。

对于小尺寸文件(例如图像),它可以正常工作。

现在我有两个问题:

  1. 有没有办法知道文件的完整大小,它处于传输状态。例如。如果显示的消息是复制30 MB 100 MB,我想获得100 MB?

  2. 是否有DirectoryWatcher的替代方案,只有在完全添加文件时才会通知?

  3. 请建议。

1 个答案:

答案 0 :(得分:1)

您目前正在寻找文件系统,您应该查看下载请求中的响应标头。

例如,当您使用NSURLConnection下载文件时,您可以实现委托方法连接:didReceiveResponse:并查看响应标头。

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
        NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response;
        NSLog(@"Expected content length: %lld", httpResponse.expectedContentLength);
    }
}

要在完成后收到通知,您可以实现connectionDidFinishLoading:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    // Notify download success
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    // Notify error
}