下载时确定文件大小

Posted

技术标签:

【中文标题】下载时确定文件大小【英文标题】:determine a filesize while downloading 【发布时间】:2012-08-01 09:30:58 【问题描述】:

我想确定正在下载的文件的文件大小。 我使用 ASIHTTPRequest 并且通常它应该跳转到 didReceiveBytes 但它没有这样做相反我启动了一个计时器来重复检查该位置的文件大小。 像这样:

NSError* error;
NSFileManager* fm = [NSFileManager defaultManager];
NSDictionary* itemAttributes = [fm attributesOfItemAtPath:_location error:&error];
if(!error)
    unsigned long long fsize = [itemAttributes fileSize];
    [downloadLabel setText:[NSString stringWithFormat:@"%llu MB downloaded",fsize] ];
    NSLog(@"MB downloaded: %llu", fsize);
 else 
    NSLog(@"error=%@", error);

问题是在文件下载完成之前,我收到以下错误:

  error=Error Domain=NSCocoaErrorDomain Code=260 "The operation couldn’t be completed.             (Cocoa error 260.)" UserInfo=0xf57aa60 NSFilePath= "long filename", NSUnderlyingError=0xf57ad90 "The operation couldn’t be completed. No such file or directory"

完成后它终于给了我:

下载的 MB:34443951

事实上,我最后下载的 MB 告诉我文件路径是正确的。但是为什么它在下载时告诉我该文件不存在?我该如何解决?

【问题讨论】:

【参考方案1】:

使用ASIHTTP lib for network,你可以轻松做到。

阅读“自定义进度跟踪”部分。

或者你可以使用

-(NSURLRequest *)connection:(NSURLConnection *)connection
        willSendRequest:(NSURLRequest *)request
       redirectResponse:(NSURLResponse *)response 


long long size = [response expectedContentLength];

但是so站点里面有很多解决方案:http://goo.gl/0hrK2

【讨论】:

问题是下载文件的内容长度在下载开始时没有给出,因为它是一个流。我已经用progressDelegate试过了,就像说不会跳到didReceiveBytes 您需要仔细检查服务器端。服务器可能没有将该标头放入响应中。 在询问了在服务器端工作的人后,我得到的答案是服务器无法在标头中发送内容长度,因为文件在下载时放在一起并且不能改变了。所以真正的唯一方法似乎是通过 NSFileManager 请求文件大小。我只是不明白是什么导致下载时没有此类文件错误【参考方案2】:

最后我最终直接从 ASIHTTP 请求中请求字节:

unsigned long long bytes = request.totalBytesRead;
double mb;
if(bytes >0)
    mb = bytes/1000000.0f;        
    [downloadLabel setText:[NSString stringWithFormat:@"%.2f MB downloaded",mb] ];

使用触发的计时器不断检索此值以更新下载的字节并转换为表示 MB。

【讨论】:

【参考方案3】:

试试这个代码,它可能对你有帮助

- (void)request:(ASIHTTPRequest *)request didReceiveData:(NSData *)data


    [request contentLength];
    [downloadButtton setTitle:@"Cancel" forState:UIControlStateNormal];
    [downloadButtton addTarget:self action:@selector(cancelDownloading) forControlEvents:UIControlEventTouchUpInside];
    long length = [request contentLength];

    fileLength = length;

    NSLog(@"fileLength ====> %f",fileLength);


  //  progressView.hidden=NO;
   // progressText.hidden=NO;
    double length2 = [data length];
    currentLength += length2;
    //    double progress = currentLength/fileLength;



  NSString *firstDataLength=[NSString stringWithFormat:@"%.2f MB",fileLength/1024/1024 ];
   NSString *totalMBytes=[NSString stringWithFormat:@" of %.2f MB",fileLength/1024/1024 ];
   NSString *totalMBytesWritten=[NSString stringWithFormat:@"%.2f MB",currentLength/1024/1024];


    NSLog(@"firstDataLength %@",firstDataLength);
    NSLog(@"totalMBytes %@",totalMBytes);
    NSLog(@"totalMBytesWritten %@",totalMBytesWritten);



    progressText.text=[totalMBytesWritten stringByAppendingString:totalMBytes];
    NSUInteger left = [data length];
    NSUInteger nwr = 0;
    do 
        nwr = [fileStreem write:[data bytes] maxLength:left];
        if (-1 == nwr) break;
        left -= nwr;
     while (left > 0);
    if (left) 
        NSLog(@"stream error: %@", [fileStreem streamError]);
    



【讨论】:

以上是关于下载时确定文件大小的主要内容,如果未能解决你的问题,请参考以下文章

确定文件大小时的Python无限循环

确定 iOS 应用程序的总磁盘使用量/文件大小

用于从网站下载图像并显示文件大小的 Java 程序

如何从字符串中确定文件的大小

文件下载期间文件大小不会显示在 PHP 下载脚本上

使用 PHP 进行下载时,文件大小是不是有限制?