【发布时间】:2018-02-18 03:01:29
【问题描述】:
我们编写了一个应用程序来将内容从 OneDrive 帐户移动到 Azure 存储。我们已经设法让它工作,但在处理大文件 (> 1GB) 和块 Blob 时遇到了内存问题。我们认为 Append Blob 是最好的方法,因为它可以解决内存问题。
我们正在使用对 SharePoint 的 RPC 调用来获取大文件的文件流,可以在此处找到更多信息: http://sharepointfieldnotes.blogspot.co.za/2009/09/downloading-content-from-sharepoint-let.html
将文件从 OneDrive 写入本地存储时,使用以下代码可以正常工作
using (var strOut = System.IO.File.Create("path"))
using (var sr = wReq.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[16 * 1024];
int read;
bool isHtmlRemoved = false;
while ((read = sr.Read(buffer, 0, buffer.Length)) > 0)
{
if (!isHtmlRemoved)
{
string result = Encoding.UTF8.GetString(buffer);
int startPos = result.IndexOf("</html>");
if (startPos > -1)
{
//get the length of the text, '</html>' as well
startPos += 8;
strOut.Write(buffer, startPos, read - startPos);
isHtmlRemoved = true;
}
}
else
{
strOut.Write(buffer, 0, read);
}
}
}
这会创建具有正确大小的文件,但是当我们尝试将其写入 Azure 存储中的附加 blob 时,我们不会获得完整的文件,而在其他情况下会获得更大的文件。
using (var sr = wReq.GetResponse().GetResponseStream())
{
byte[] buffer = new byte[16 * 1024];
int read;
bool isHtmlRemoved = false;
while ((read = sr.Read(buffer, 0, buffer.Length)) > 0)
{
if (!isHtmlRemoved)
{
string result = Encoding.UTF8.GetString(buffer);
int startPos = result.IndexOf("</html>");
if (startPos > -1)
{
//get the length of the text, '</html>' as well
startPos += 8;
//strOut.Write(buffer, startPos, read - startPos);
appendBlob.UploadFromByteArray(buffer, startPos, read - startPos);
isHtmlRemoved = true;
}
}
else
{
//strOut.Write(buffer, 0, read);
appendBlob.AppendFromByteArray(buffer, 0, read);
}
}
}
这是正确的做法吗?为什么我们会得到不同的文件大小?
任何建议将不胜感激
谢谢
【问题讨论】:
标签: c# azure sharepoint azure-storage onedrive