使用元数据将 Azureblob 从一个容器复制到另一个容器

Copy Azureblob from one container to another with metadata

如何将 blob 及其元数据从一个容器复制到另一个容器,目前 blob 的副本日期设置为当前日期。如何从原始 blob 设置新 blob 的修改日期。

 private void MoveBlobFromThisContainerToBackupContainer(CloudBlobContainer sourceContainer, string sourceDirectory, CloudBlobContainer backupContainer, string backupDirectory, bool isToAddSourceDirectory)
            {
                backupContainer.CreateIfNotExists();

                var sas = sourceContainer.GetSharedAccessSignature(new SharedAccessBlobPolicy()
                {
                    SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15),
                    SharedAccessExpiryTime = DateTime.UtcNow.AddDays(1),
                    Permissions = SharedAccessBlobPermissions.Read | SharedAccessBlobPermissions.Write,
                });

                var blobs = sourceContainer.ListBlobs();
                if (sourceDirectory.Trim().Length > 0 && sourceDirectory.ToUpper() != "ALL")
                {
                    CloudBlobDirectory dir = sourceContainer.GetDirectoryReference(sourceDirectory);
                    blobs = dir.ListBlobs();
                }
                foreach (IListBlobItem sourceBlob in blobs)
                {
                    if (sourceBlob.GetType() == typeof(CloudBlockBlob))
                    {
                        CloudBlockBlob srcBlob = (CloudBlockBlob)sourceBlob;

                        string backupBlobName = srcBlob.Uri.Segments[srcBlob.Uri.Segments.Length - 1];
                        if (sourceDirectory.Length > 0 && isToAddSourceDirectory) backupBlobName = sourceDirectory + "\" + backupBlobName;
                        if (backupDirectory.Trim().Length > 0) backupBlobName = backupDirectory + "\" + backupBlobName;
                        lblStatus.ForeColor = Color.Blue;
                        lblStatus.Text = "Blob: " + backupBlobName;
                        CloudBlockBlob targetBlob = backupContainer.GetBlockBlobReference(backupBlobName);

                        if (targetBlob.Exists())
                        {
                            lblStatus.ForeColor = Color.DarkGray;
                            lblStatus.Text = lblStatus.Text + " already Exists...not copied...";
                        }
                        else if (srcBlob.Properties.LastModified.Value.DateTime >= dateTimePicker1.Value )
                        {
                            var srcBlockBlobSasUri = string.Format("{0}{1}", srcBlob.Uri.AbsoluteUri, sas);
                            targetBlob.StartCopyFromBlob(new Uri(srcBlockBlobSasUri));
                        }
                    }
                    }
                }
            }

提前致谢..

我对你的问题的理解是你在寻找两件事:

  • 当 blob 从一个帐户复制到另一个帐户时保留元数据。

这应该会发生。除非您在复制操作期间指定元数据,否则应将源 blob 的元数据复制到目标 blob。来自 Copy Blob 文档:

Optional. Specifies a user-defined name-value pair associated with the blob. If no name-value pairs are specified, the operation will copy the metadata from the source blob or file to the destination blob. If one or more name-value pairs are specified, the destination blob is created with the specified metadata, and metadata is not copied from the source blob or file.

  • 在目标 blob 中保留源 blob 的修改日期。

我认为这是不可能的。最后修改日期是系统 属性,当 blob 为 created/updated 时会更新。由于复制 blob 操作会在目标位置创建一个新的 blob,因此它的最后修改日期始终是 created/last 更新的时间。你不能保留那个。

更新

can i set the date and time that the specified file was last written to

是的,你可以。实现此目的的一种方法是在目标 blob 上设置自定义元数据。它的工作方式是获取源 blob 的最后修改日期并创建自定义元数据条目(例如 SourceBlobLastModified)并将其值设置为源 blob 的最后修改日期。请注意,如果要将源 blob 的元数据复制到目标 blob,则必须将源 blob 的每个元数据项作为复制操作的一部分与这个新的元数据条目一起添加。否则目标 blob 将只有一个条目。