2013-02-19 1 views
4

Мое приложение использует хранилище облачных облаков Microsoft Azure, и я ищу альтернативный способ получить последний элемент в папке в контейнере.получить последний blobitem в лазурном контейнере

Вот как это теперь идет:

CloudBlobClient blobClient = new CloudBlobClient("http://ferryjongmans.blob.core.windows.net/", new StorageCredentialsSharedAccessSignature(signature.Text)); 
CloudBlobContainer container = blobClient.GetContainerReference(cameraList.Items[Convert.ToInt32(Label1.Text)].ToString()); 

//Maak mooie datum notatie zoals : 01-01-2013 (standaard methode geeft in dit geval: 1-1-2013) 
string dag = DateTime.Now.Day.ToString(); 
if (dag.Length == 1) 
{ 
    string temp = dag; 
    dag = "0" + temp; 
} 
string maand = DateTime.Now.Month.ToString(); 
if (maand.Length == 1) 
{ 
    string temp = maand; 
    maand = "0" + temp; 
} 
//Complete datum (DD-MM-YYYY) 
string datum = dag + "-" + maand + "-" + DateTime.Now.Year.ToString(); 

CloudBlobDirectory direct = container.GetDirectoryReference(cameraList.Items[Convert.ToInt32(Label1.Text)].ToString()); 
CloudBlobDirectory subdir = direct.GetSubdirectory(datum); 

BlobRequestOptions options = new BlobRequestOptions(); 
options.UseFlatBlobListing = true; 
options.BlobListingDetails = BlobListingDetails.Snapshots; 
//maak string voor het tijdelijk oplaan van de uri 
string uri=""; 
//Ken steeds een waarde aan 'uri' toe om vervolgens wanneer de for loop klaar is 
//de laatste uri te krijgen. 
foreach (var blobItem in subdir.ListBlobs(options)) 
{ 
    uri = blobItem.Uri.ToString(); 
} 
string url = uri + signature.Text; 
if (url != pictureBox2.ImageUrl) 
{ 
    loadImage(url); 
} 

Так я зацикливание по элементам и использовать каждый раз, когда ту же строку, чтобы присвоить URI из сгустка. Когда цикл закончен, моя строка имеет URI последнего элемента в каталоге.

Думаю, я могу сделать это более эффективным способом. В каталоге есть много капель. (+ - 30000)

Этот фрагмент кода будет запускаться один раз в секунду, поэтому его важно, чтобы он работал эффективным образом.

ответ

0

Я создал функцию в моем приложении загрузки, который будет писать каждый раз полный URI новейшего изображения в виде текстового файла (TXT)

   CloudBlobClient blobClient = new CloudBlobClient(sUrl, new StorageCredentialsSharedAccessSignature(signature)); 
       CloudBlobContainer container = blobClient.GetContainerReference(container1); 
       CloudBlobDirectory dir = container.GetDirectoryReference(cameranaam); 
       CloudBlob cloudBlob = dir.GetBlobReference(cameranaam+".txt"); 
       cloudBlob.UploadText(blobSAS.Uri.ToString()); 

И это таймер моего другого проекта, который загрузка последнего изображения сервера:

  blobClient = new CloudBlobClient(blobstoreurl, new StorageCredentialsSharedAccessSignature(signature)); 
      container = blobClient.GetContainerReference(containerName); 
      CloudBlobDirectory dir = container.GetDirectoryReference(comboBoxCameras.SelectedItem.ToString()); 
      CloudBlob cloudBlob = dir.GetBlobReference(comboBoxCameras.SelectedItem.ToString().Replace(" ","")+".txt"); 
      pictureBoxLiveViewer.ImageLocation = cloudBlob.DownloadText()+signature; 
+0

blobclient и контейнер во второй части объявлены вне этой функции (во всем мире) –

0

Что делать, если вы конвертируете свой список в hashSet? замените свой foreach на это и посмотрите, что произошло.

var hashSet = new HashSet<IListBlobItem>(subdir.ListBlobs(options).ToList()); 

string url = uri = hashSet.Last().Uri.ToString() + signature.Text; 

hashSet быстрее для поиска и поиска.

+0

Это не работает, приложение очень медленно реагирует на эту функцию, и я не получаю изображение, когда я назначаю URL-адрес как местоположение изображения. –

0

Я нахожу, что принятый ответ путают и плохо объясняют. Мое предпочтение следующим образом:

Чтобы создать переходный файл (то есть: это имя дает ему контекст) Я использую Azure Blob Storage виртуальных каталогов и имя блобо специально используя Секунды С Epoch.

Например, если у вас есть каталог с контуром «SomeContainer/SomeFolder /». Этот каталог содержит один или несколько файлов, названных с использованием Seconds Since Epoch, упомянутых выше. Для того, чтобы принести «последний» или последний файл, используйте следующую команду:

StorageCredentials cred = new StorageCredentials("{{YOUR ACCOUNT NAME}}", ""{{YOUR ACCOUNT KEY}}"); 
CloudStorageAccount storageAccount = new CloudStorageAccount(cred, true); 
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); //invoke the blob client 
CloudBlobContainer container = blobClient.GetContainerReference("SomeContainer"); //get your container reference 
CloudBlobDirectory directory = container.GetDirectoryReference("SomeFolder"); //resolve the directory 
IListBlobItem latestBlobItem = directory.ListBlobs(true, BlobListingDetails.All).LastOrDefault(); //get the latest blobItem 
CloudBlockBlob blockBlob = null; 

if(latestBlobItem != null && !String.IsNullOrWhiteSpace(latestBlobItem.Uri.LocalPath)) 
{ 
    //get the blob's local path 
    string fullLocalPath = latestBlobItem.Uri.LocalPath; 
    //remove container and leading slash 
    string localPath = fullLocalPath.Substring(fullLocalPath.IndexOf('/', 1) + 1); 

    //get your blob reference 
    blockBlob = container.GetBlockBlobReference(localPath); 
} 

Оттуда делать, как вы хотите со ссылкой блок двоичных объектов (скачать и т.д.)

Happy blobbing!

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

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