我發現的所有,這是這種方法GET Bucket 但我不明白我怎麼才能得到當前文件夾中的文件夾列表。我需要使用哪個前綴和分隔符?這可能嗎?Amazon S3:如何獲取存儲桶中的文件夾列表?
回答
例如起見,假設我在USEast1
區域稱爲MyBucketName
水桶,使用下列按鍵:
temp/
temp/foobar.txt
temp/txt/
temp/txt/test1.txt
temp/txt/test2.txt
temp2/
使用文件夾可能會造成混淆,因爲S3本身不支持層次結構 - - 相反,這些只是像任何其他S3對象一樣的鍵。文件夾只是S3 Web控制檯中提供的一種抽象,可以更輕鬆地瀏覽存儲桶。因此,當我們以編程方式工作時,我們希望找到與「文件夾」(分隔符'/',size = 0)尺寸匹配的鍵,因爲它們很可能是由S3控制檯呈現給我們的'文件夾'。
請注意這兩個示例:我正在使用AWSSDK.S3版本3.1 NuGet軟件包。
實施例1:在水桶
該代碼從this basic example修改S3文檔中列出在一個桶中的所有鍵的所有文件夾。下面的示例將標識以分隔符字符/
結尾的所有密鑰,並且它們也是空的。
IAmazonS3 client;
using (client = new AmazonS3Client(Amazon.RegionEndpoint.USEast1))
{
// Build your request to list objects in the bucket
ListObjectsRequest request = new ListObjectsRequest
{
BucketName = "MyBucketName"
};
do
{
// Build your call out to S3 and store the response
ListObjectsResponse response = client.ListObjects(request);
// Filter through the response to find keys that:
// - end with the delimiter character '/'
// - are empty.
IEnumerable<S3Object> folders = response.S3Objects.Where(x =>
x.Key.EndsWith(@"/") && x.Size == 0);
// Do something with your output keys. For this example, we write to the console.
folders.ToList().ForEach(x => System.Console.WriteLine(x.Key));
// If the response is truncated, we'll make another request
// and pull the next batch of keys
if (response.IsTruncated)
{
request.Marker = response.NextMarker;
}
else
{
request = null;
}
} while (request != null);
}
預計輸出到控制檯:
temp/
temp/txt/
temp2/
例2:文件夾匹配指定前綴的
你可以進一步限制這僅通過設置Prefix
檢索匹配指定Prefix
文件夾物業ListObjectsRequest。
ListObjectsRequest request = new ListObjectsRequest
{
BucketName = "MyBucketName",
Prefix = "temp/"
};
當施加到實施例1,我們希望下面的輸出:
temp/
temp/txt/
進一步閱讀:
使用的the/path/to/read/
prefix
(注意,沒有斜線,但有是結尾的斜線),以及/
delimiter
,你會發現裏面<CommonPrefixes>
該文件夾內的所有文件夾。
CommonPrefixes
的響應可以包含
CommonPrefixes
只有在指定的分隔符。當您這樣做時,CommonPrefixes
包含Prefix和由定界符指定的字符串的下一次出現之間的所有鍵(如果有的話)。實際上,CommonPrefixes列出了在Prefix
指定的目錄中充當子目錄的密鑰。例如,如果前綴是notes /而分隔符是斜槓(/),則在notes/summer/july中,常用前綴是notes/summer /。計算退貨數量時,所有在一個通用前綴中彙總的密鑰計爲一次返回。見MaxKeys。http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGET.html
或者另一種更簡單的方法是使用https://github.com/minio/minio-dotnet
Minio的.Net實現最小的API與Amazon S3和其他兼容的存儲解決方案的工作。
以下示例顯示瞭如何只過濾出目錄。這裏CommonPrefix通過ListObjects()API被抽象爲一個文件夾。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Minio;
using Minio.Xml;
namespace Minio.Examples
{
class ListObjects
{
static int Main(string[] args)
{
var client = new MinioClient("https://s3.amazonaws.com", "ACCESSKEY", "SECRETKEY");
var items = client.ListObjects("bucket");
foreach (Item item in items)
{
if (item.IsDir)
{
Console.Out.WriteLine("{0}", item.Key);
}
}
return 0;
}
}
}
安東尼在這裏丟失的是一個文件夾不一定有一個關聯它的關鍵。如果一個文件是在S3中創建的,並且給出了一個像「folder/name.ext」這樣的密鑰,那麼S3會顯示一個「文件夾」文件夾,但它沒有密鑰,這意味着你沒有得到它的結果。
捕獲這些文件夾的唯一方法是查看這些鍵本身,並將「/」字符的鍵名正則表達。如果我知道C#更好一點,我會給你寫一個代碼示例,但是參考這裏是一個python example我寫了另一個問題。
- 1. 如何從URL獲取Amazon AWS S3存儲桶中的文件?
- 2. 如何從S3存儲桶中的文件夾獲取對象
- 3. 動態獲取Amazon S3存儲桶中文件的大小
- 4. 如何檢查Amazon S3存儲桶內文件夾的子文件夾大小
- 5. Amazon S3存儲桶中的子文件夾目錄瀏覽
- 6. 添加文件夾中的Amazon S3桶
- 7. 使用mulerequester從Amazon S3存儲桶獲取文件
- 8. 如何使用Node.js獲取Amazon S3存儲桶的總大小?
- 9. Amazon S3存儲桶備份
- 10. Amazon S3存儲桶策略
- 11. Amazon S3存儲桶上傳
- 12. Amazon S3安全存儲桶
- 13. 使用python列出Amazon S3存儲桶中的所有文件
- 14. 在wordpress頁面上的Amazon s3存儲桶中列出文件
- 15. 如何獲取文件列表裏面的文件夾在亞馬遜S3桶
- 16. 我們如何在Amazon S3存儲桶中爲文件夾設置CORS
- 17. C#列表中的Amazon S3文件夾
- 18. 獲取存儲在Amazon S3
- 19. 如何從AWS S3存儲桶獲取唯一對象列表
- 20. 如何通過PHP API在Amazon S3存儲桶下創建文件夾?
- 21. Mule ESB:如何獲取Amazon S3桶中的文件夾中的所有文件(獲取對象內容)
- 22. 如何使用PHP在S3存儲桶中創建文件夾
- 23. PHP如何在aws s3存儲桶中創建文件夾?
- 24. 在Unity中的Amazon S3存儲桶之間傳輸文件
- 25. 從Titanium下載Amazon S3存儲桶中的文件
- 26. 連接Amazon S3存儲桶中的文件
- 27. 複製同一Amazon S3存儲桶中的文件
- 28. 很多文件出現在我的Amazon S3存儲桶中
- 29. 如何從S3存儲獲取文件?
- 30. 從boto2下載S3存儲桶中的子文件夾文件
謝謝你的詳細回覆。當我在x.Size == 1上更改x.Size == 0時,此代碼適用於我。但它不能識別所有文件夾,只能識別它們中的一小部分。我無法理解爲什麼會發生這種情況。我正是這樣,我的週期一遍又一遍,直到它結束。但我無法獲得所有的文件夾。可能是什麼原因? – neustart47
也許與您相關將尺寸更改爲1?在這個列表調用中,'文件夾'作爲沒有內容的S3對象呈現:它們應該是大小0.如果沒有它,您可以簡單地從謂詞中移除大小。 –
如果您在此之後仍然遇到問題,請確保您的ListObjectsRequest不會過多地限制您的請求。例如,如果您指定了一個前綴...在沒有它的情況下測試您的代碼,以確保它不會過多地限制您的請求。如果這不起作用,可以隨時提出一個新問題(這個問題非常清楚,我們不想把它弄得混亂),舉例說明了你的存儲桶的結構和你試圖製作的請求。 –