11

BLOBストレージに毎日json個のファイルを生成しているとします。私がしたいのは、私のディレクトリのどれかで最新のファイルを修正することです。私は2016/02/03/test.jsonを取得したい最新のファイルをAzure BLOBから変更する

2016/01/02/test.json 
2016/01/02/test2.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; 
} 
+1

最後に、最終的に変更されたプロパティを持つ複数のフォルダパスのシナリオをどのように達成しましたか? – Neo

答えて

15

各IListBlobItemはCloudBlockBlob、CloudPageBlob、またはCloudBlobDirectoryになるだろう。

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

コンテナ内のすべてのブロブに対してO(n)スキャンを実行します。これは、何十万ものファイルがある場合には時間がかかります。現在のところ、ブロブストレージのより効率的なクエリを実行する方法はありません(ファイルネームを乱用し、新しい日付がアルファベット順に最初に来るように日付をエンコードしない限り)。現実的には、より良いクエリのパフォーマンスが必要な場合は、索引付けされたDateModified列や、ファイルへのアクセスに便利なBLOBパスの列など、すべてのファイルリストを行として表すデータベース表を便利に保つことをお勧めします。

+0

ディレクトリについてはどうですか?最終更新日時にアクセスする方法は? –

+0

ディレクトリ?コンテナを意味しますか?または、ブロブ名が持つことができる人工パス区切り構文を意味しますか? –

+0

後のもの(ブロブ名が持つことができる擬似パス区切り構文) –

1

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

7

Yarと同様に、個々のBLOBオブジェクトのLastModifiedプロパティを使用できます。

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

注:BLOB型が<CloudBlockBlob>ではないかもしれないここでは、正しいコンテナへの参照を持っていたら、それを行う方法を示したコードスニペットです。必要に応じて変更してください。

関連する問題