将lStream复制到字节数组


HRESULT hr = URLOpenBlockingStreamW(nullptr, cstring, &pStream, 0, nullptr);
if (FAILED(hr))
{
return 1;
}
char buffer[4096];
do
{
DWORD bytesRead = 0;
hr = pStream->Read(buffer, sizeof(buffer), &bytesRead);

if (bytesRead > 0)
{
std::cout.write(buffer, bytesRead);
}

} while (SUCCEEDED(hr) && hr != S_FALSE);
//memcpy(&bytesRead, arr, sizeof(buffer));
if (FAILED(hr))
{
return 2;
}
return 0;

我过去所做的是下载文件并从中读取,但现在我正试图直接将文件下载到内存中。我不需要用勺子喂。我对此很陌生,如果有什么解释的话,我想得到一个解释,这样我就可以真正学习了。我发现的唯一例子是上面的代码。我不知道如何直接从流中将字节复制到字节数组。(或者如何从网站上的文件中获得确切的文件大小(。

在C#中,只需将文件下载到一个路径并使用File.ReadAllBytes(path);

EDIT:这是用C++编写的,而不是像旧版本那样用C#编写的(如果您无法从代码片段中判断(。

IStream有一个Stat()方法用于查询流的大小(以及其他内容(。查询大小,然后分配一个该大小的字节数组,然后将Read()分配到数组中。

如果Stat()无法确定大小(因为下载是流式的,并且事先不知道完整大小(,那么只需使用std::vector作为字节数组,这样它就会随着写入更多字节而增长。

HRESULT hr = URLOpenBlockingStreamW(nullptr, cstring, &pStream, 0, nullptr);
if (FAILED(hr))
return 1;
std::vector<char> bytes;
STATSTG stat = {};
hr = pStream->Stat(&stat, STATFLAG_NONAME | STATFLAG_NOOPEN);
if (SUCCEEDED(hr))
{
size_t size = stat.cbSize.QuadPart;
if (size > 0)
{
bytes.resize(size);
char *buffer = bytes.data();
DWORD bytesRead;
do
{
hr = pStream->Read(buffer, size, &bytesRead);
if (FAILED(hr))
return 2;
if (bytesRead == 0)
break;
buffer += bytesRead;
size -= bytesRead;
}
}
}
else
{
char buffer[1024];
DWORD bytesRead;
do
{
hr = pStream->Read(buffer, sizeof(buffer), &bytesRead);
if (FAILED(hr)
return 3;
if (bytesRead == 0)
break;
bytes.insert(bytes.end(), buffer, buffer + bytesRead);
}
while (true);
}
// use bytes as needed...
return 0;

最新更新