2013-04-11 58 views
1

Im在亞馬遜S3上存儲所有類型的文件。在亞馬遜S3桶中,所有文件存儲在不同的文件夾中,我知道在亞馬遜S3中沒有文件夾的概念。對象只能通過它們的鍵來識別。如果我存儲任何帶有'mydocs/personal/profile-pic.jpg'這樣的密鑰的文件,這意味着將在那裏創建兩個父文件夾(mydocs文件夾內的個人文件夾)。在java中計算S3對象(文件夾)大小

我想計算java中'mydocs'之類的任何文件夾的大小。我用下面給出該代碼桶計算總規模:

public long calculateBucketSize(String bucketName) { 
long totalSize = 0; 
    int totalItems = 0; 
    ObjectListing objects = listObjects(bucketName); 
    do { 
     for (S3ObjectSummary objectSummary : objects.getObjectSummaries()) { 
      totalSize += objectSummary.getSize(); 
      totalItems++; 
     } 
     objects = listNextBatchOfObjects(objects); 
    } while (objects.isTruncated()); 
    System.out.println("Amazon S3 bucket: " + bucketName + " containing " 
      + totalItems + " objects with a total size of " + totalSize 
      + " bytes."); 

    return totalSize; 
} 

此方法將返回桶總規模。我想計算任何單個文件夾的大小。任何幫助將不勝感激。

+0

嘗試使用對象= listObjects(bucketName /文件夾名),如在嘗試只是通過文件夾對象分析和計算總大小。 – 2013-04-11 13:41:11

回答

0

我想你想在每個級別獲得文件夾的大小。如果您有一個根文件夾R-Folder和兩個子文件夾S1.1-Folder,S1.2-Folder然後S1.1-Folder又有三個子文件夾S1.1.1-Folder,S1.1.2-Folder,S1。 1.3文件夾。現在你想要每個文件夾的文件夾大小

R-Folder (32MB) 
|__S1.1-Folder (22MB) 
| |__S1.1.1-Folder (7MB) 
| |__S1.1.2-Folder (5MB) 
| |__S1.1.3-Folder (10MB) 
| 
|__S1.2-FOlder (10MB) 

我是否正確?

您必須保持列表文件夾的詳細信息狀態isCompleted或不 - 並且遞歸掃描每個文件夾。並且當內部文件夾成功完成時,您必須更新其相應父級的大小,並且父級將更新到那裏相應的父級,並且每次都會繼續到根級。

+1

感謝您的回覆,你得到了我的問題,但它不是合適的解決方案,通過這樣做,如果我有數百個文件和文件夾,將需要大量的時間來計算父文件夾的大小地獄。這將是遞歸循環來計算所有子文件/文件夾。我需要解決方案,比如我上面發佈的代碼來計算整個桶的大小,或者更好的是我在數據庫中存儲文件和文件夾的大小,並計算所有這些大小。 – Haseeb 2013-04-18 10:45:45

1

對於斯卡拉開發人員,在這裏它是執行全掃描和使用地圖的AmazonS3桶的內容遞歸函數的正式AWS SDK for Java

import com.amazonaws.services.s3.AmazonS3Client 
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest} 
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala} 

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = { 

    def scan(acc:List[T], listing:ObjectListing): List[T] = { 
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries()) 
    val mapped = (for (summary <- summaries) yield f(summary)).toList 

    if (!listing.isTruncated) mapped.toList 
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing)) 
    } 

    scan(List(), s3.listObjects(bucket, prefix)) 
} 

要調用上述咖喱map()功能,只需將已構建的(並已正確初始化的)AmazonS3Client對象(請參閱官方AWS SDK for Java API Reference),存儲桶名稱和前綴名稱傳遞給第一個參數列表。還要通過您想要應用的功能f()來映射第二個參數列表中的每個對象摘要。

例如

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize)) 

將返回該桶/前綴(key, owner, size)元組的完整列表

map(s3, "bucket", "prefix")(s => s.getSize).sum 

將返回的那桶/前綴內容

總規模

您可以結合map()如果前綴是你的文件夾名稱

ObjectListing objects = listObjects(bucketName,prefix); 


:與許多其他的功能,你通常會被Monads in Functional Programming