ブロブストレージに毎日いくつかの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;
}
各IListBlobItemは、CloudBlockBlob、CloudPageBlob、またはCloudBlobDirectoryになります。
ブロックまたはページblob、またはそれらの共有基本クラスCloudBlob
にキャストした後(できればas
キーワードを使用してnullをチェックすることにより)、blockBlob.Properties.LastModified
経由で変更された日付にアクセスできます。
あなたの実装は、O(n)コンテナ内のすべてのblobをスキャンすることに注意してください。これは、数十万のファイルがある場合、時間がかかる可能性があります。現在、これ以上行う方法はありません。ただし、Blob Storageの効率的なクエリ(ファイルの名前を悪用し、新しい日付がアルファベット順で最初に来るように日付をエンコードしない限り)。より良いクエリパフォーマンスが必要な場合、現実的には、行としてのファイルリスト。検索するためのインデックス付きのDateModified列や、ファイルに簡単にアクセスするためのblobパスを持つ列など。
Yarが言ったように、個々のblobオブジェクトのLastModified
プロパティを使用できます。正しいコンテナへの参照を取得したら、その方法を示すコードスニペットを次に示します。
var latestBlob = container.ListBlobs()
.OfType<CloudBlockBlob>()
.OrderByDescending(m => m.Properties.LastModified)
.ToList()
.First();
注:blobタイプは<CloudBlockBlob>
ではない場合があります。必要に応じて変更してください。
Azure Web Jobs SDK を使用します。 SDKには、新規または更新されたBLOBを監視するオプションがあります。
//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);
}
問題が発生した場合はblockBlob.Container.Properties.LastModified