Azure C ++库:“无效的streambuf对象”

问题描述 投票:1回答:2

我正在尝试使用C ++ Azure客户端库下载可能很大的Azure块blob。它不起作用,因为我不知道如何使用缓冲区大小初始化concurrency :: streams :: streambuf对象。我的代码看起来像这样:

 // Assume blockBlob has been created correctly.
 concurrency::streams::istream blobStream = blockBlob.open_read();
 // I don't know how to initialize this streambuf:         
 concurrency::streams::streambuf<uint8_t> dlStreamBuf;
 size_t nBytesReturned = 0, nBytesToRead = 65536;
 do {
    // This gets the exception "Invalid streambuf object": 
    concurrency::task<size_t> returnedTask = blobStream.read(dlStreamBuf, nBytesToRead);
    nBytesReturned = returnedTask.get();
    bytesSoFar += nBytesReturned;
    // Process the data in dlStreamBuf here...
 } while(nBytesReturned > 0);
 blobStream.close();

请注意,上述streambuf不应与标准C ++ streambuf混淆。

谁能告诉我如何正确构建和初始化并发:: streams :: streambuf?

谢谢。

c++ azure azure-storage-blobs
2个回答
1
投票

streambuf似乎是一个模板类。试试这个:

    concurrency::streams::container_buffer<std::vector<uint8_t>> output_buffer;
    size_t nBytesReturned = 0, nBytesToRead = 65536;
    do {
        // This gets the exception "Invalid streambuf object": 
        concurrency::task<size_t> returnedTask = stream.read(output_buffer, nBytesToRead);
        nBytesReturned = returnedTask.get();
        bytesSoFar += nBytesReturned;
        // Process the data in dlStreamBuf here...
    } while (nBytesReturned > 0);
    stream.close();

示例代码在这里:https://github.com/Azure/azure-storage-cpp/blob/76cb553249ede1e6f05456d936c9a36753cc1597/Microsoft.WindowsAzure.Storage/tests/blob_streams_test.cpp#L192


0
投票

我没有使用C ++的流方法,但是在C ++文档中提到了两种关于下载到文件或蒸汽的方法here

download_to_stream方法ex:

    // Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the blob client.
azure::storage::cloud_blob_client blob_client = storage_account.create_cloud_blob_client();

// Retrieve a reference to a previously created container.
azure::storage::cloud_blob_container container = blob_client.get_container_reference(U("my-sample-container"));

// Retrieve reference to a blob named "my-blob-1".
azure::storage::cloud_block_blob blockBlob = container.get_block_blob_reference(U("my-blob-1"));

// Save blob contents to a file.
concurrency::streams::container_buffer<std::vector<uint8_t>> buffer;
concurrency::streams::ostream output_stream(buffer);
blockBlob.download_to_stream(output_stream);

std::ofstream outfile("DownloadBlobFile.txt", std::ofstream::binary);
std::vector<unsigned char>& data = buffer.collection();

outfile.write((char *)&data[0], buffer.size());
outfile.close();  

替代方案,使用download_to_file:

    // Retrieve storage account from connection string.
azure::storage::cloud_storage_account storage_account = azure::storage::cloud_storage_account::parse(storage_connection_string);

// Create the blob client.
azure::storage::cloud_blob_client blob_client = storage_account.create_cloud_blob_client();

// Retrieve a reference to a previously created container.
azure::storage::cloud_blob_container container = blob_client.get_container_reference(U("my-sample-container"));

// Retrieve reference to a blob named "my-blob-2".
azure::storage::cloud_block_blob text_blob = container.get_block_blob_reference(U("my-blob-2"));

// Download the contents of a blog as a text string.
utility::string_t text = text_blob.download_text();
© www.soinside.com 2019 - 2024. All rights reserved.