Amazon web services 递归打印文件和文件夹的所有键不会';I don’我没有按预期工作

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

我们在AmazonS3中存储了几个文件和文件夹

我们使用以下代码来迭代给定根文件夹的所有文件和文件夹

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
在本例中,只有一个子文件夹对象,但可以说实际上有两个子文件夹

获取子文件夹的Java ish psuedo代码:

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();
    }