通过Azure C编程在容器中创建一个子文件夹

3
目前我有许多容器。对于每个容器,我想从不同的存储帐户添加一个只包含文件夹名称的空文件夹。然后,我想用必要的数据填充它。
我不确定是否有一个属性可以在容器中创建文件夹。
这里我有两个容器,一个来自我的源帐户(sourceAccount),另一个是我的目标帐户(targetAccount)。我正在从我的源账户发送数据到我的目标账户。在我的目标账户的dayBlob容器中,我想创建子文件夹。
在代码的这个部分,我正在获取所有容器。当我获取这些容器时,我会获取每个容器的名称。我想在我的目标容器中添加与我的foreach中获取的名称相对应的子文件夹。
        foreach (var items in containers)
        {
            var containerName = items.Name;

        }

我的代码如下所示

static CloudStorageAccount sourceAccount = new CloudStorageAccount(new StorageCredentials("name", "key"), true);
static CloudStorageAccount targertAccount = new CloudStorageAccount(new StorageCredentials("name", "key"), true);

        static void Main(string[] args)
    {
                  DateTime dateToday = DateTime.Today;

        DateTime date = new DateTime();
        DateTime dateutc = TimeZoneInfo.ConvertTimeToUtc(date);
        TimeSpan startDay = new TimeSpan(00, 00, 00);
        TimeSpan endDay = new TimeSpan(23, 59, 59);
        var sourceClient = sourceAccount.CreateCloudBlobClient();
        var targetClient = targetAccount.CreateCloudBlobClient();
        var testContainer = sourceClient.GetContainerReference("test");
        var sourceContainer = sourceClient.GetContainerReference("downloads");
        var itDropBoxContainer = sourceClient.GetContainerReference("it-dropbox");
        var dayBlob = targetClient.GetContainerReference($"day{dateToday.Day}");

        date = DateTime.Parse($"{dateToday.Day}/{dateToday.Month}/{dateToday.Year}");
        var start = date + startDay;
        var end = date + endDay;
        IEnumerable<CloudBlobContainer> containers = sourceClient.ListContainers();

        foreach (var items in containers)
        {
            var containerName = items.Name;

        }

            foreach (IListBlobItem item in testContainer.ListBlobs(useFlatBlobListing: true))
            {

                var blob = item as CloudBlockBlob;
                var modificationDate = blob.Properties.LastModified;
                // to set the modfication date as local time
                var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
                var lastModified = TimeZoneInfo.ConvertTime((DateTimeOffset)modificationDate, britishZone);
                if (lastModified > start && lastModified < end)
                {
                    try
                    {

                        if (blob != null)
                        {
                            CloudBlockBlob sourceBlob = testContainer.GetBlockBlobReference(blob.Name);
                            CloudBlockBlob targetBlob = dayBlob.GetBlockBlobReference(blob.Name);

                            Console.WriteLine($"Successfully created a snapshot of blob {blob.Name}");
                        }
                    }
                    catch (Exception ex)
                    {

                        ExceptionHandler.LogError(ex, "Failed to copy to the target folder");
                    }
                }

                else
                {
                    Console.WriteLine($"Failed to create a snapshot of blob {blob.Name}");

                }

            }
    }

@GauravMantri 我已更新我的问题。我想在每个目标容器中添加3个文件夹。我想要从源容器中的容器获取这些文件夹的名称。 - Craig Gallagher
谢谢!但我不确定我理解你的代码。当你退出forEach循环时,containerName变量的值将始终是存储帐户中最后一个容器的名称。或者你只想在这个循环中创建一个子文件夹? - Gaurav Mantri
@GauravMantri 我想在第一个foreach循环中创建文件夹,但我不知道该怎么做。 - Craig Gallagher
简单的答案是你不能,因为Azure Blob Storage不支持空文件夹。在Azure Blob Storage中,文件夹只是blob名称的前缀。如果你想创建文件夹,你需要创建一个blob(零字节的blob就可以),并将该blob的名称前缀设置为所需的文件夹名称。 - Gaurav Mantri
非常感谢,您知道我如何在 Blob 的名称前添加前缀吗? - Craig Gallagher
显示剩余2条评论
1个回答

8
如 @GauravMantri 所提到的,我们无法独立创建文件夹,因为文件夹是 Blob 存储中的虚拟实体。您在使用之前不需要先创建文件夹。例如,即使文件夹1不存在于容器中,我们也可以获取文件夹1的引用。
var directory = container.GetDirectoryReference("folder1");
// Retrieve reference to a blob named "myblob".
CloudBlockBlob blockBlob = directory.GetBlockBlobReference("myblob");

如果您想创建一个文件夹,您需要在其中创建一个blob。

var directory = container.GetDirectoryReference("folder1");
CloudBlockBlob blockBlob = directory.GetBlockBlobReference("dummy.txt");
blockBlob.UploadFromByteArray(new byte[0], 0, 0);

要列出容器中的所有文件夹,您可以使用以下代码。
var folders = container.ListBlobs().Where(b => b as CloudBlobDirectory != null).ToList();
foreach (var folder in folders)
{
    Console.WriteLine(folder.Uri);
}

这正是我正在寻找的。有没有办法指定 blob 信息(如文件名等),或者需要在文件被转换为 byte[] 之前完成? - Drew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接