如何在不下载的情况下读取位于 Azure 容器中的压缩 txt 文件(blob)?

How to read Zipped txt file (blob) which locates in Azure container without downloading?

我可以用这段代码读取 txt 文件,但是当我尝试读取 txt.gz 文件时,它当然不起作用。 我如何在不下载的情况下读取压缩的 blob,因为该框架将在云上运行? 也许可以将文件解压缩到另一个容器?但是我找不到解决方案。

public static string GetBlob(string containerName, string fileName)
{
    string connectionString = $"yourConnectionString";

    // Setup the connection to the storage account
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    // Connect to the blob storage
    CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
    // Connect to the blob container
    CloudBlobContainer container = serviceClient.GetContainerReference($"{containerName}");
    // Connect to the blob file
    CloudBlockBlob blob = container.GetBlockBlobReference($"{fileName}");
    // Get the blob file as text
    string contents = blob.DownloadTextAsync().Result;

    return contents;
}

without downloading, because the framework will work on cloud

这是不可能的。如果不下载文件,则无法使用 blob 存储上的文件。无论你的代码在哪里运行。当然,如果你的代码也在Azure上运行,下载时间可能会很快,但你必须先从blob存储下载。

对于您的 zip 文件,您要使用 DownloadToFileAsync() or DownloadToStreamAsync()。

您可以使用 GZipStream 即时解压缩您的 gz 文件,您不必担心下载它并在物理位置解压缩它。

public static string GetBlob(string containerName, string fileName)
{
    string connectionString = $"connectionstring";

    // Setup the connection to the storage account
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);

    // Connect to the blob storage
    CloudBlobClient serviceClient = storageAccount.CreateCloudBlobClient();
    // Connect to the blob container
    CloudBlobContainer container = serviceClient.GetContainerReference($"{containerName}");
    // Connect to the blob file
    CloudBlockBlob blob = container.GetBlockBlobReference($"{fileName}");
    // Get the blob file as text
    using (var gzStream = await blob.OpenReadAsync())
    {
        using (GZipStream decompressionStream = new GZipStream(gzStream, CompressionMode.Decompress))
        {
            using (StreamReader reader = new StreamReader(decompressionStream, Encoding.UTF8))
            {
                return reader.ReadToEnd();
            }
        }
    }
}