簡體   English   中英

在沒有正則表達式的情況下訪問 Azure 容器的 Blob 名稱

[英]Accessing Blob Name(s) for a Azure Container without Regex

我正在嘗試僅訪問 Azure Blob 的文件名。 例如,如果我當前正在返回字符串privatecontainer/Text-pc.txt並且我試圖只訪問Text-pc.txt 問題在於每個 Azure 容器中都有不同的文件。 我列出了我正在使用的代碼,用於從用戶指定的 Azure 容器生成 Blob 列表。

主運行()

 public static void MainRun()
    {
        var userInput = GetContainerNameFromUser();
        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("STORAGE_CONNECTION_STRING"));

        CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

        CloudBlobContainer container = blobClient.GetContainerReference(userInput);

        foreach (var blobItem in container.ListBlobs(useFlatBlobListing: true))
        {
          Console.WriteLine(blobItem.Parent.Uri.MakeRelativeUri(blobItem.Uri));
         // The line above for-loop will access all the Blobs within a Container
        }
    }

有沒有辦法只訪問Text-pc.txt而不必使用正則表達式? 我想遠離正則表達式的原因是當存在虛擬文件夾/目錄時,上面的for循環成功打印出文件名。 但是,在沒有虛擬文件夾/目錄的 Blob 的容器上,它將打印publiccontainer/Text-pc.txt(<container_name>/File_name)

您可以使用子字符串,因為我認為假設 blob 名稱中沒有/字符是安全的。 通過這種方式,您可以在最后一個斜杠之后獲取所有內容的子字符串。 LastIndexOf非常適合這個。 不過,這與正則表達式方法非常相似。

如果這不起作用,您可以使用 Uri 的Segments屬性。 最后一個應該是你的文件名

將執行此操作的兩種方法添加到下面的循環中:

    foreach (var blobItem in container.ListBlobs(useFlatBlobListing: true))
    {
      Console.WriteLine(blobItem.Parent.Uri.MakeRelativeUri(blobItem.Uri));

      //Segments Method
      Console.WriteLine(blobItem.Uri.Segments.Last());

      //Substring Method
      string filename = blobItem.AbsolutUri.Substring(det.Filename.LastIndexOf("/") + 1)
      Console.WriteLine(fileName);
    }

另一種解決方案是將blobItemCloudBlob並使用其Name屬性。 類似的東西:

        foreach (var blobItem in container.ListBlobs(useFlatBlobListing: true))
        {
                            Console.WriteLine((blobItem as CloudBlob).Name);
        }

請注意,對於虛擬文件夾中的 blob,將打印完整路徑 ( virtual-folder-name/file-name ),因為這是 blob 的名稱。 如果您只想要文件名,您可能需要應用 Stephen 提出的解決方案並使用/分隔符拆分字符串。

添加對 System.Linq 的引用和

var str = "privatecontainer/Text-pc.txt";
var splittedStr = str.Split('/');
var name = splittedStr.Last();

你可能想讓它更健壯一點。

如果您的文件名沒有斜線,因為沒有辦法區分文件夾或文件名,那么您只需查找最后一個斜線並獲取字符串的其余部分:

var cleanFileName = fileName.Substring(fileName.LastIndexOf("/") + 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM