web-dev-qa-db-ja.com

Azure Blobから変更された最新のファイルを取得する

ブロブストレージに毎日いくつかのjsonファイルを生成するとします。私がしたいことは、私のディレクトリのいずれかで変更された最新のファイルを取得することです。だから私は私のブロブにこのようなものを持っているでしょう:

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

2016/02/03/test.jsonを取得したい。したがって、1つの方法は、ファイルの完全パスを取得し、作成された最新のディレクトリを見つけるために正規表現チェックを実行することですが、各ディレクトリに複数のjosnファイルがある場合、これは機能しません。最新の変更されたファイルを取得するためにFile.GetLastWriteTimeのようなものはありますか?これらのコードを使用して、すべてのファイルを取得しています:

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;
}
17
Yar

各IListBlobItemは、CloudBlockBlob、CloudPageBlob、またはCloudBlobDirectoryになります。

ブロックまたはページblob、またはそれらの共有基本クラスCloudBlobにキャストした後(できればasキーワードを使用してnullをチェックすることにより)、blockBlob.Properties.LastModified経由で変更された日付にアクセスできます。

あなたの実装は、O(n)コンテナ内のすべてのblobをスキャンすることに注意してください。これは、数十万のファイルがある場合、時間がかかる可能性があります。現在、これ以上行う方法はありません。ただし、Blob Storageの効率的なクエリ(ファイルの名前を悪用し、新しい日付がアルファベット順で最初に来るように日付をエンコードしない限り)。より良いクエリパフォーマンスが必要な場合、現実的には、行としてのファイルリスト。検索するためのインデックス付きのDateModified列や、ファイルに簡単にアクセスするためのblobパスを持つ列など。

27
Mike Asdf

Yarが言ったように、個々のblobオブジェクトのLastModifiedプロパティを使用できます。正しいコンテナへの参照を取得したら、その方法を示すコードスニペットを次に示します。

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

注:blobタイプは<CloudBlockBlob>ではない場合があります。必要に応じて変更してください。

11
Zachary Keener

Azure Web Jobs SDK を使用します。 SDKには、新規または更新されたBLOBを監視するオプションがあります。

2
viperguynaz
       //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);

        }
1
ASHISH RANJAN

問題が発生した場合はblockBlob.Container.Properties.LastModified

1
Prashant N