11

Скажем, я генерирую пару файлов json каждый день в моем хранилище blob. Я хочу сделать, чтобы последний файл был изменен в любом из моих каталогов. Так что я бы что-то подобное в моем сгустке:Получение последнего файла, измененного с Azure Blob

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

Я хочу получить 2016/02/03/test.json. Таким образом, одним из способов является получение полного пути к файлу и проверка регулярных выражений, чтобы найти последний созданный каталог, но это не работает, если у меня есть более одного файла 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.

После заброса, чтобы блокировать или страницу блоба, или их разделяемые базовый класс CloudBlob (предпочтительно с помощью ключевого слова as и проверки нуля), вы можете получить доступ к дате изменений через blockBlob.Properties.LastModified.

Обратите внимание, что ваша реализация будет выполнять проверку O (n) по всем блокам в контейнере, что может занять некоторое время, если есть сотни тысяч файлов. В настоящее время нет способа сделать более эффективный запрос хранилища blob, хотя (если вы не злоупотребляете именем файла и не кодируете дату таким образом, чтобы новые даты в алфавитном порядке начинались первым). Реально, если вам нужна более высокая производительность запросов, я бы рекомендовал хранить таблицу базы данных в удобном виде, которая представляет все списки файлов в виде строк, причем такие вещи, как индексированный столбец DateModified для поиска, и столбец с контуром blob для легкого доступа к файлу.

+0

Что относительно каталогов? как получить доступ к последнему измененному времени? –

+0

Справочники? Вы имеете в виду контейнеры? Или вы имеете в виду конструкцию разметки искусственного пути, которую могут иметь имена blob? –

+0

Более поздний (построитель искусственного пути, который может иметь имена blob, может иметь) –

7

Как сказал Яр, вы можете использовать свойство LastModified отдельного объекта blob. Вот фрагмент кода, который показывает, как сделать это, как только у вас есть ссылка на соответствующий контейнер:

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

Примечание: Тип BLOB не может быть <CloudBlockBlob>. Обязательно измените это, если необходимо.

 Смежные вопросы

  • Нет связанных вопросов^_^