访问没有正则表达式的Azure容器的Blob名称

时间:2016-04-20 20:40:02

标签: c# azure

我正在尝试仅访问Azure Blob的文件名。例如,如果我当前正在返回字符串privatecontainer/Text-pc.txt,而我正尝试访问Text-pc.txt。问题是每个Azure容器中都有不同的文件。我列出了我正在使用的代码,从用户指定的Azure容器生成Blob列表。

MainRun()

 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的Container上,它将打印publiccontainer/Text-pc.txt,即(<container_name>/File_name)

4 个答案:

答案 0 :(得分:1)

另一种解决方案可能是将viewWillDisappear转换为blobItem并使用其CloudBlob属性。类似的东西:

Name

请注意,对于虚拟文件夹中的blob,将打印完整路径( foreach (var blobItem in container.ListBlobs(useFlatBlobListing: true)) { Console.WriteLine((blobItem as CloudBlob).Name); } ),因为它是blob的名称。如果您只想要文件名,则可能需要应用Stephen提出的解决方案并使用virtual-folder-name/file-name分隔符拆分字符串。

答案 1 :(得分:0)

添加对System.Linq和

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

你可能想让它更健壮一点。

答案 2 :(得分:0)

您可以使用子字符串,因为我认为可以安全地假设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);
    }

答案 3 :(得分:0)

如果您的文件名没有斜杠(这是不应该的),因为那样就无法区分文件夹还是文件名,那么您只需查找最后一个斜杠并获得字符串的其余部分:

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