从Azure Blob获取最新文件

时间:2016-03-28 16:47:25

标签: c# azure azure-storage-blobs azure-sdk-.net azure-blob-storage

假设我每天在blob存储中生成几个json个文件。我想要做的是在我的任何目录中修改最新的文件。所以我的blob中有这样的东西:

2016/01/02/test.json
2016/01/02/test2.json
2016/02/03/test.json

我想得到2016/02/03/test.json。因此,一种方法是获取文件的完整路径并执行正则表达式检查以查找创建的最新目录,但如果每个目录中有多个josn文件,则此方法无效。是否有类似File.GetLastWriteTime的内容来获取最新修改的文​​件? 我正在使用这些代码获取所有文件btw:

public static CloudBlobContainer GetBlobContainer(string accountName, string accountKey, string containerName)
{
    CloudStorageAccount storageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
    // blob client
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    // container
    CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
    return blobContainer;
}

public static IEnumerable<IListBlobItem> GetBlobItems(CloudBlobContainer container)
{
    IEnumerable<IListBlobItem> items = container.ListBlobs(useFlatBlobListing: true);
    return items;
}

public static List<string> GetAllBlobFiles(IEnumerable<IListBlobItem> blobs)
{
    var listOfFileNames = new List<string>();

    foreach (var blob in blobs)
    {
        var blobFileName = blob.Uri.Segments.Last();
        listOfFileNames.Add(blobFileName);
    }
    return listOfFileNames;
}

7 个答案:

答案 0 :(得分:23)

每个IListBlobItem都将是CloudBlockBlob,CloudPageBlob或CloudBlobDirectory。

在转换为阻止或页面blob或其共享基类CloudBlob后(最好使用as关键字并检查为null),您可以通过blockBlob.Properties.LastModified访问修改日期

请注意,您的实现将对容器中的所有blob执行O(n)扫描,如果有数十万个文件,则可能需要一段时间。然而,目前还没有办法对blob存储进行更有效的查询,(除非你滥用文件命名并以新的日期按字母顺序排在第一位之前对日期进行编码)。实际上,如果您需要更好的查询性能,我建议保留一个方便的数据库表,将所有文件列表表示为行,其中包括要搜索的索引DateModified列和带有blob路径的列以便于访问文件

答案 1 :(得分:8)

像Yar所说,您可以使用单个blob对象的LastModified属性。这是一个代码片段,一旦您引用了正确的容器,就会显示如何执行此操作:

var latestBlob = container.ListBlobs()
    .OfType<CloudBlockBlob>()
    .OrderByDescending(m => m.Properties.LastModified)
    .ToList()
    .First();

注意:blob类型可能不是<CloudBlockBlob>。如有必要,请务必更改。

答案 2 :(得分:2)

使用Azure Web Jobs SDK。 SDK具有监视新/更新的BLOB的选项。

答案 3 :(得分:2)

       //connection string
        string storageAccount_connectionString = "**NOTE: CONNECTION STRING**";

        // Retrieve storage account from connection string.
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(storageAccount_connectionString);

        // Create the blob client.
        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        // Retrieve reference to a previously created container.
        CloudBlobContainer container = blobClient.GetContainerReference("**NOTE:NAME OF CONTAINER**");
        //The specified container does not exist

        try
        {
            //root directory
            CloudBlobDirectory dira = container.GetDirectoryReference(string.Empty);
            //true for all sub directories else false 
            var rootDirFolders = dira.ListBlobsSegmentedAsync(true, BlobListingDetails.Metadata, null, null, null, null).Result;

            foreach (var blob in rootDirFolders.Results)
            {
                if (blob is CloudBlockBlob blockBlob)

                {
                    var time = blockBlob.Properties.LastModified;
                    Console.WriteLine("Data", time);

                }
            }

        }
        catch (Exception e)
        {
            //  Block of code to handle errors
            Console.WriteLine("Error", e);

        }

答案 4 :(得分:0)

如果有问题,请使用blockBlob.Container.Properties.LastModified

答案 5 :(得分:0)

使用Microsoft.Azure.Storage.Blob,您可以按照以下步骤进行操作:

Created

上面给定存储帐户的代码:

  • 获取帐户中的所有容器
  • 吸收所有斑点是容器
  • 将blob名称保存为LastModified if (first_entry == false) { cout << "Enter data first.\n"; system("pause"); goto main; } 在csv文件中(命名为容器)

答案 6 :(得分:0)

对于新的 V12 Nuget 包,以前的答案已经过时。我使用以下指南帮助从版本 9 升级到版本 12 https://elcamino.cloud/articles/2020-03-30-azure-storage-blobs-net-sdk-v12-upgrade-guide-and-tips.html

新的 nuget 包是 Azure.Storage.Blobs,我使用的是 12.8.4 版

以下代码将获取您的上次修改日期。您也可以编写此代码的异步版本。

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Azure.Storage.Blobs;
using Azure.Storage.Sas;
using Azure.Storage.Blobs.Specialized;

DateTimeOffset? GetLastModified()
{
    BlobServiceClient blobServiceClient = new BlobServiceClient("connectionstring")
    BlobContainerClient blobContainerClient = blobServiceClient.GetBlobContainerClient("blobname");
    BlobClient blobClient = blobContainerClient.GetBlobClient("file.txt");
    if (blobClient == null || !blobClient.Exists()) return null;
    DateTimeOffset lastModified = blobClient.GetProperties().Value.LastModified;
    return lastModified;
}