我正在尝试仅访问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)
。
答案 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);