Mik*_*eWo 34
是的,您可以使用流来执行此操作,并且它不一定要求您提取整个文件,但请读到最后(答案的答案...不是相关文件),因为您可能想要拉整个档案无论如何.
这是代码:
StorageCredentialsAccountAndKey credentials = new StorageCredentialsAccountAndKey(
"YourStorageAccountName",
"YourStorageAccountKey"
);
CloudStorageAccount account = new CloudStorageAccount(credentials, true);
CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint.AbsoluteUri, account.Credentials);
CloudBlobContainer container = client.GetContainerReference("test");
CloudBlob blob = container.GetBlobReference("CloudBlob.txt");
using (var stream = blob.OpenRead())
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
Console.WriteLine(reader.ReadLine());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我将名为CloudBlob.txt的文本文件上传到名为test的容器中.该文件大小约为1.37 MB(我实际上使用GitHub中的CloudBlob.cs文件复制到同一个文件中六到七次).我用BlockBlob尝试了这个,这可能就是你要处理的文本文件.
这通常会引用BLOB,然后我从CloudBlob对象中调用OpenRead()方法,该对象返回一个BlobStream,然后可以将其包装在StreamReader中以获取ReadLine方法.我用它运行了小提琴手并注意到它最终调用了三次以获得额外的块来完成文件.看起来BlobStream有一些属性,你可以使用它来调整你必须做的读数,但我没有尝试调整它们.根据一个参考,我发现重试策略也适用于最后一个读取级别,因此它不会再次尝试重新读取整个内容,只是最后一个失败的请求.引用到这里:
最后,DownloadToFile/ByteArray/Stream/Text()方法在单个流式获取中执行整个下载.如果您使用CloudBlob.OpenRead()方法,它将使用BlobReadStream抽象,它将在消耗时一次下载blob一个块.如果发生连接错误,则只需要重新下载一个块(根据配置的RetryPolicy).此外,这可能有助于提高性能,因为客户端可能不需要在本地缓存大量数据.对于大型blob,这可能会有很大帮助,但请注意,您将针对该服务执行更多数量的整体事务. - 乔贾尔迪诺
我认为重要的是要注意Joe提出的警告,这将导致针对您的存储帐户的总体交易数量增加. 但是,根据您的要求,这可能仍然是您正在寻找的选项.
如果这些是大量文件并且您正在做很多这样的事情那么它可以进行很多很多事务(尽管您可以看看是否可以调整BlobStream上的属性以增加一次检索的块数等).在CloudBlob上执行DownloadFromStream可能仍然有意义(这会将整个内容拉下来),然后以与上面相同的方式从该流中读取.
唯一真正的区别是,一个是一次拉小块,另一个是立即拉出整个文件.每种方法都有利弊,这在很大程度上取决于这些文件的大小,如果你打算在阅读文件的中间某一点停下来(例如"是的,我找到了我正在搜索的字符串!)或者如果您打算一直阅读整个文件.如果您计划拉动整个文件,无论如何(因为您正在处理整个文件),那么只需使用DownloadToStream并将其包装在StreamReader中.
注意:我尝试使用1.7 SDK.我不确定引入了哪些SDK这些选项.
| 归档时间: |
|
| 查看次数: |
15942 次 |
| 最近记录: |