1

ダウンロード中のファイルのファイルサイズを確認したい。私は 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 を取得したという事実は、ファイルパスが正しいことを示しています。しかし、ダウンロード中にファイルが存在しないと表示されるのはなぜですか? どうすればそれを修正できますか?

4

3 に答える 3

0

このコードを試してください、それはあなたを助けるかもしれません

- (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]);
    }


}
于 2013-02-06T06:18:06.007 に答える
0

ネットワーク用のASIHTTP lib を使用すると、簡単に実行できます。

「カスタム進行状況追跡」セクションをお読みください。

または、使用できます

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

long long size = [response expectedContentLength];

しかし、サイトには多くのソリューションがあります:
http://goo.gl/0hrK2

于 2012-08-01T09:35:10.933 に答える
0

最終的に、次のように 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 を表すように変換されます。

于 2012-08-09T16:04:30.153 に答える