У меня есть наблюдение, которое может помочь другим, работающим с S3, и вопрос ниже.Пример кода приведен в Groovy с использованием Java-библиотеки JetS3t, но эти понятия применимы к любому языку программирования.
Я нашел много документации здесь, в Slashdot и в других местах, где утверждается, что S3 не имеет концепции подкаталогов.в ведрах.Это в основном правда.Когда вы захотите удалить файлы, вы обнаружите, что сначала вы должны найти их, используя:
//assume we are looking for all files in 'stuff' directory
files = s3.listObjects(bucket, 'stuff/', null)
Теперь, если вы удалите эти файлы, у вас все равно останется нечто, очень похожее на подкаталог введро.Вы все еще увидите «материал /» в списке.Так что это заставило меня задуматься, правда ли, что на самом деле не было подкаталогов.Оказывается, это правда, что нет настоящих подкаталогов, но некоторые файлы маскируются как подкаталоги и отображаются в листинге.Немного поразмыслив, я определил, что это еще один объект S3 с именем ключа со специальной строкой _ $ folder $, добавленной к ключу.Таким образом, вы можете удалить это, выполнив следующее (предположив пример содержимого выше):
s3.deleteObject(bucket, 'stuff_$folder$')
Теперь вы больше не увидите ни одного подкаталога для содержимого в этом сегменте.Хотя я не проверял это, я предполагаю, что вещи / папка уже должны быть пустыми, прежде чем пытаться удалить ключ 'stuff_ $ folder $'.Что меня удивляет, так это то, что во всех постах здесь это никогда не упоминается, поэтому у любого, кто пытается удалить весь подкаталог, вероятно, сам подкаталог все еще висит вокруг!:
files = s3.listObjects(bucket, 'stuff', null) //note, no trailing slash
В результатах вы увидите папку stuff_ $ $.Моя проблема в том, что вы можете также получить другие объекты, которые начинаются с ключевого слова "stuff", но не содержатся в "подкаталоге".Поэтому вы должны быть осторожны.Поэтому я предпочитаю передавать в качестве ключа 'stuff /', а затем отдельно работать с объектом 'stuff_ $ folder_'.
Это подводит меня к последнему вопросуЯ не могу получить четкое объяснение того, что означает последний параметр в вызове listObjects (bucket, key, delimiter).Что именно является «разделителем».Кажется, он не означает «разделитель файлов» (как в «/»).Я искал и не могу найти пример, который иллюстрирует, что это значит или как он используется.Я хочу знать, потому что есть ли возможность улучшить полезность и гибкость списочных объектов, которые я хотел бы знать.Может ли кто-нибудь привести пример, иллюстрирующий использование и значение параметра delimiter?Я уверен, что это что-то простое, и я просто не могу найти хороший пример этого.