Amazon web services 递归打印文件和文件夹的所有键不会';I don’我没有按预期工作
我们在AmazonS3中存储了几个文件和文件夹 我们使用以下代码来迭代给定根文件夹的所有文件和文件夹Amazon web services 递归打印文件和文件夹的所有键不会';I don’我没有按预期工作,amazon-web-services,Amazon Web Services,我们在AmazonS3中存储了几个文件和文件夹 我们使用以下代码来迭代给定根文件夹的所有文件和文件夹 ObjectListing listing = s3.listObjects( bucketName, prefix ); List<S3ObjectSummary> summaries = listing.getObjectSummaries(); while (listing.isTruncated()) { listing = s3.listNextBatchOfObje
ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated()) {
listing = s3.listNextBatchOfObjects (listing);
summaries.addAll (listing.getObjectSummaries());
}
有什么问题吗?AWS或文件夹中的任何限制不应为数字,或者是否存在任何逻辑问题
当使用上述代码时
FolderA/0/将作为键出现,而FolderA/1…FolderA/10没有出现
谢谢。亚马逊S3中没有文件夹或目录之类的东西。AmazonS3是一个关键的数据存储。文件夹和子文件夹是对对象键中“/”字符的人工解释。S3不知道也不关心它们 通过创建以“/”字符结尾的0字节对象,可以在S3中“伪造”空文件夹的创建 迭代对象列表时,将包括这些0字节的“文件夹” 但是,您也可能有诸如“folder1/object1”之类的对象,在您的脑海中,“folder1”是根目录下的子文件夹。但是在S3中,可能没有“folder1/”这样的对象。在这种情况下,您将不会看到“folder1/”单独在结果列表中输出 如果需要获得所有“子文件夹”的列表,则不仅需要查找以“/”字符结尾的对象,还需要检查所有对象是否有“/”字符,并从对象的键推断出子文件夹,因为文件夹本身可能没有0字节的对象 例如:
- folder1/object1
- 折叠2/
- folder2/object1
function getSubFolders(bucketName, currentFolder)
{
// Use the current folder as the S3 prefix
var prefix = currentFolder;
// Get all objects
ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated()) {
listing = s3.listNextBatchOfObjects (listing);
summaries.addAll (listing.getObjectSummaries());
}
// Split the list into files in the current folder and sub-folders
List<string> subFolders = new List<string>();
List<string> files = new List<string>();
foreach (var summary in summaries)
{
var key = summary.key;
// The key includes the prefix, so remove it
key = key.subString(prefix.length);
// If the key includes a / character, then
// it's in a subfolder. Just save the subfolder part
// of this object.
// Otherwise, save the key in our list of files.
var slashIndex = key.indexOf("/");
if (slashIndex >= 0)
{
subFolders.add(key.subString(0, slashIndex));
}
else
{
files.add(key);
}
}
// Remove duplicate entries from our subFolder list
subFolders = subFolders.distinct();
}
函数getSubFolders(bucketName,currentFolder)
{
//使用当前文件夹作为S3前缀
var前缀=currentFolder;
//获取所有对象
ObjectListing=s3.listObjects(bucketName,前缀);
List summaries=listing.getObjectSummaries();
while(listing.isTruncated()){
listing=s3.listenxtbatchofobjects(listing);
summaries.addAll(listing.getObjectSummaries());
}
//将列表拆分为当前文件夹和子文件夹中的文件
列表子文件夹=新建列表();
列表文件=新列表();
foreach(汇总中的var汇总)
{
var key=summary.key;
//密钥包含前缀,因此请将其删除
key=key.subString(前缀.length);
//如果键包含/字符,则
//它在子文件夹中。只需保存子文件夹部分
//这个物体的形状。
//否则,请将密钥保存在文件列表中。
var slashIndex=key.indexOf(“/”);
如果(slashIndex>=0)
{
添加(key.subString(0,slashIndex));
}
其他的
{
文件。添加(键);
}
}
//从子文件夹列表中删除重复条目
子文件夹=子文件夹.distinct();
}
带有数字字符的文件夹未正确递归填充 目前决议如下:
这似乎是一个有点昂贵的操作,但它是有效的。S3中没有文件夹这样的东西。您可以通过web控制台创建伪文件夹,该控制台实际上使用该键创建了一个空对象,这可能就是您看到的少数正在按预期工作的文件夹。是的。我需要所有空对象,即子文件夹下的文件夹。代码看起来与相同。逐步检查代码并验证其是否正确循环。同时,再次检查你的结果:他们可能是正确的,但你认为他们是错误的。然后请再次阅读我的答案。它正好解决了这个问题。“打印或获取密钥的问题”。。。也不问题是文件夹密钥不存在。所以你必须自己决定文件夹。当我们浏览S3浏览器或cloud berry或cyberduck时,我们能够看到所有文件夹…当我们使用上述代码重复相同的内容并打印密钥时。不会打印文件夹名称。请帮助我,因为我只需要其他浏览器或浏览器中显示的所有名称。这些其他程序正在从现有的对象键推断子文件夹。正是我在回答中所说的。您需要查看所有对象并构建自己的子文件夹列表。Matt House..如何通过代码实现它。你能帮我修改代码或者修改上面的代码来得到结果吗?我已经添加了一些java-ish伪代码。它可以更好地优化,但它应该给你一个想法。这并不能解决问题,因为对象摘要本身并不适用于指定的两个文件夹
function getSubFolders(bucketName, currentFolder)
{
// Use the current folder as the S3 prefix
var prefix = currentFolder;
// Get all objects
ObjectListing listing = s3.listObjects( bucketName, prefix );
List<S3ObjectSummary> summaries = listing.getObjectSummaries();
while (listing.isTruncated()) {
listing = s3.listNextBatchOfObjects (listing);
summaries.addAll (listing.getObjectSummaries());
}
// Split the list into files in the current folder and sub-folders
List<string> subFolders = new List<string>();
List<string> files = new List<string>();
foreach (var summary in summaries)
{
var key = summary.key;
// The key includes the prefix, so remove it
key = key.subString(prefix.length);
// If the key includes a / character, then
// it's in a subfolder. Just save the subfolder part
// of this object.
// Otherwise, save the key in our list of files.
var slashIndex = key.indexOf("/");
if (slashIndex >= 0)
{
subFolders.add(key.subString(0, slashIndex));
}
else
{
files.add(key);
}
}
// Remove duplicate entries from our subFolder list
subFolders = subFolders.distinct();
}