Перечислите все файлы в (под) каталогах в Azure - PullRequest
0 голосов
/ 31 октября 2018

Я занимаюсь разработкой функции Azure с использованием Java. Мне нужно перебрать все файлы в следующей папке

aDirectory/aSubdirectoryWithManyFiles/

В этом пути много файлов:

aDirectory/aSubdirectoryWithManyFiles/file1
aDirectory/aSubdirectoryWithManyFiles/file2
aDirectory/aSubdirectoryWithManyFiles/file3
aDirectory/aSubdirectoryWithManyFiles/file4
aDirectory/aSubdirectoryWithManyFiles/file5

поэтому я написал следующий код, чтобы получить их все:

// myCloudBlobContainer is a CloudBlobContainer
// I expected to get all files thanks to the next row
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs();
// The only blob found in the container is the directory itself
for (ListBlobItem blob : blobs) {
    //log the current blob URI
    if (blob instanceof CloudBlob) {  // this never happens
        CloudBlob cloudBlob = (CloudBlob) blob;
        //make nice things with every found file
    }
}

Единственный большой двоичный объект, повторяемый в for, - это каталог, а не ожидаемые файлы. поэтому в логах я получаю только следующий URI:

https://blablablabla.blob.core.windows.net/aDirectory/aSubdirectoryWithManyFiles/

Что я должен сделать, чтобы получить доступ к каждому файлу?

А в случае, если у меня будет более одного подкаталога, как в следующем примере?

aDirectory/aSubdirectoryWithManyFiles/files(1-5)
aDirectory/anotherSubdirectoryWithManyFiles/files(6-10)

Заранее спасибо


Редактировать

Для того, чтобы сделать методы тестируемыми, проект использует обертки и интерфейсы, вместо того, чтобы напрямую использовать CloudBlobContainer; в основном, CloudBlobContainer задается как CloudBlobClient.getContainerReference("containername")

После ответа на этот вопрос я изменил код на следующий поэтому я использовал listBlobs с параметрами myCloudBlobContainer.listBlobs("aDirectory", true) и написал следующий код, чтобы получить их все:

// myCloudBlobClient is a CloudBlobClient
CloudBlobContainer myCloudBlobContainer = myCloudBlobClient.getContainerReference("containername")
// I expected to get all files thanks to the next row
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs("aDirectory", true); // HERE THE CHANGE
// No blob found this time
for (ListBlobItem blob : blobs) { // NEVER IN THE FOR
    //log the current blob URI
    if (blob instanceof CloudBlob) {
        CloudBlob cloudBlob = (CloudBlob) blob;
        //make nice things with every found file
    }
}

Но на этот раз в for ...

ничего не происходит

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Я должен сказать, что предыдущий ответ заставил меня терять время; проблема заключалась в том, что для поиска файлов в папках недостаточно одного for. Первый for находит папки и подпапки, плюс (возможно, я не проверял) файлы, которые находятся в «корне» (давайте назовем это так).

Имея папки, для каждой из них мы должны преобразовать их в CloudBlobDirectory, чтобы увидеть и перебрать все содержащиеся в них файлы с другим for.

Вот решение, которое работает для меня:

// myCloudBlobClient is a CloudBlobClient
CloudBlobContainer myCloudBlobContainer = myCloudBlobClient.getContainerReference("containername")
// I expected to get all files thanks to the next row
Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs();
// only directories here, another for needed to scan files
for (ListBlobItem blob : blobs) {
    if (blob instanceof CloudBlobDirectory) {
        CloudBlobDirectory directory = (CloudBlobDirectory)blob;
        //next is in try/catch
        Iterable<ListBlobItem> fileBlobs = directory.listBlobs();
        for (ListBlobItem fileBlob : fileBlobs) {
            if (fileBlob instanceof CloudBlob) {
            CloudBlob cloudBlob = (CloudBlob) fileBlob;
            //make nice things with every found file
            }
        }
    } // else: may be we found a cloudBlob in root?
}

Это помогло мне найти правильный путь:

https://social.msdn.microsoft.com/Forums/en-US/1cfdc91f-e588-4839-a878-9650339a0a06/list-all-blobs-in-c?forum=windowsazuredata

0 голосов
/ 31 октября 2018

Попробуйте использовать следующее переопределение метода listBlobs:

listBlobs(String prefix, boolean useFlatBlobListing)

Итак, ваш код будет:

Iterable<ListBlobItem> blobs = myCloudBlobContainer.listBlobs("aDirectory", true);

Это перечислит все BLOB-объекты в виртуальной папке «aDirectory» в вашем контейнере BLOB-объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...