【问题标题】:NSStream, getting percentage of bytes readNSStream,获取读取字节的百分比
【发布时间】:2012-01-30 17:28:48
【问题描述】:

我正在将文件上传到服务器,使用 NSStream API 读取块。我正在尝试显示一个显示上传进度的进度条。我无法找到一个可靠的解决方案来确定读入文件的字节数。更改文件和块大小,我仍然不断获得总字节数,或者读取字节数为 93 或 212 之类的奇怪内容。有没有人有任何尝试做到这一点的提示?看起来应该很简单。

  // create the write stream
    NSOutputStream *outputStream = [NSOutputStream outputStreamToFileAtPath:uploadTempFilename append:NO];
    [outputStream open];

    const char *UTF8String;
    size_t writeLength;
    UTF8String = [multipartBegin UTF8String];
    writeLength = strlen(UTF8String);

    size_t __unused actualWrittenLength;
    actualWrittenLength = [outputStream write:(uint8_t *)UTF8String maxLength:writeLength];

    NSLog(@"actualWrittenLength1 %d bytes)", actualWrittenLength);//this will be 908
    // open the input stream
    const size_t bufferSize = 128 ;
    size_t readSize = 0;
    uint8_t *buffer = (uint8_t *)calloc(1, bufferSize);

    [inImageStream open];
    while ([inImageStream hasBytesAvailable]) {
        if (!(readSize = [inImageStream read:buffer maxLength:bufferSize])) {
            break;
        }


     size_t __unused actualWrittenLength;


        actualWrittenLength = [outputStream write:buffer maxLength:readSize];

        NSLog(@"actualWrittenLength2 %d bytes)", actualWrittenLength);//this always outputs 128, until the last call which will be something like 22


    }

    //NSLog(@"NSStreamFileCurrentOffsetKey %d", [outputStream valueForKey:NSStreamFileCurrentOffsetKey]);
    [inImageStream close];
    free(buffer);


    UTF8String = [multipartEnd UTF8String];
    writeLength = strlen(UTF8String);
    actualWrittenLength = [outputStream write:(uint8_t *)UTF8String maxLength:writeLength];

    NSLog(@"actualWrittenLength3 %d bytes)", actualWrittenLength);//this will always be 42

[outputStream close];



    NSInputStream *inputStream = [NSInputStream inputStreamWithFileAtPath:uploadTempFilename];

    [HTTPRequest setContentType:contentType];
    return [HTTPRequest performMethod:@"POST" onURL:url withInputStream:inputStream knownContentSize:fileSize];

【问题讨论】:

    标签: iphone ios ios5 nsstream


    【解决方案1】:

    你试过NSStreamFileCurrentOffsetKey的属性值吗?

    CF-API 也可能值得一看。

    如果需要,您可以将-[NSOutputStream write:maxLength:] 子类化以跟踪当前位置。

    【讨论】:

    • 谢谢。如果可能的话,我想把它和 Obj-C 一起保存。我已经尝试过该调用(请参阅添加的代码),但它返回的是奇数值。我不确定如何使用 NSStreamFileCurrentOffsetKey;它不适用于键值调用。
    • 这个答案有什么不是 Objective-C 的?
    • @akaru 看看这个:cocoabuilder.com/archive/cocoa/…
    • @Abizern Justin 也向我介绍了 Core Foundation API。这就是我所指的。
    • 现在想通了。必须使用 propertyForKey: 用于 NSStreamFileCurrentOffsetKey。效果很好。仍然很想知道为什么 -[NSOutputStream write:maxLength:] 返回奇怪的值。
    猜你喜欢
    • 2019-07-08
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多