如何从 Azure Blob 存储获取今天修改的文件

Fik*_*lal 5 c# azure azure-blob-storage

我想从 Azure Blob 存储中获取每天修改的文件。我们在 Azure 中有一个容器,每天由两个 Excel 文件填充,我需要获取这些文件。

到目前为止,我只能使用latestmodifiedon. 我怎样才能得到这两个文件?

private static DataSet GetExcelBlobData()
{
    var containerName = "salesbycontract";
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(Microsoft.Azure.CloudConfigurationManager.GetSetting("StorageConnectionString"));

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(containerName);
    CloudBlockBlob blockbob = container.ListBlobs().OfType<CloudBlockBlob>().OrderByDescending(m => m.Properties.LastModified).ToList().First();

    var x = blockbob.Name;
    Console.WriteLine(x);

    DataSet ds;
    using (var memstream = new MemoryStream())
    {
        blockbob.DownloadToStream(memstream);

        var excelReader = ExcelReaderFactory.CreateOpenXmlReader(memstream);
        ds = excelReader.AsDataSet();
        excelReader.Close();
    }
    return ds;
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*ndl 4

只需添加一个Where子句并与以下内容进行比较DateTime.Today

var blockbob = container.ListBlobs().OfType<CloudBlockBlob>()
    .Where(m => m.Properties.LastModified.Value.Date == DateTime.Today).ToList().First();
Run Code Online (Sandbox Code Playgroud)

向 GitHub存储库添加了一个工作示例,该示例使用 dotnet core 和最新的 WindowsAzure.Storage SDK:

public async Task RetrieveBlobsModifiedTodayAsync()
{
    var container = _blobClient.GetContainerReference(_storageAccount.ContainerName);

    BlobContinuationToken blobContinuationToken = null;
    do
    {
        var results = await container.ListBlobsSegmentedAsync(null, blobContinuationToken);

        var blobs = results.Results.OfType<CloudBlockBlob>()
            .Where(b => b.Properties.LastModified != null && b.Properties.LastModified.Value.Date == DateTime.Today);

        blobContinuationToken = results.ContinuationToken;
        foreach (var item in blobs)
        {
            Console.WriteLine(item.Uri);
        }
    } while (blobContinuationToken != null); // Loop while the continuation token is not null. 
}
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这在客户端而不是服务器端执行过滤。就我而言,我有一个 Azure Blob 容器,其中包含 400 万个 Blob(使用内容可寻址存储方案,因此每个 Blob 的名称就是其哈希) - 获取所有 Blob 的列表一次大约需要 30 分钟。如果 Azure 可以对 blob 进行服务器端过滤,我会很高兴。 (6认同)