4

我在我的 Azure 存储帐户中上传了一个文本文件。现在,在我的工作角色中,我需要做的是每次运行时,它都会从数据库中获取一些内容,并且该内容必须写入上传的文本文件中,具体来说,每次文本文件的内容都应该被一些新的内容覆盖。

在这里,他们提供了一种将文本文件上传到您的存储并删除文件的方法。但我不想这样做,每次只需要修改已经存在的文本文件。

4

1 回答 1

8

我假设您指的是在 Windows Azure blob 中存储文件。如果是这种情况: blob 不是文件系统;它只是一个存储数据的地方(文件的概念有点人为 - 它只是......存储在一堆块中的 blob)。

要修改文件,您需要下载它并将其保存到本地磁盘,修改它(再次,在本地磁盘上),然后进行上传。对此的一些想法:

  • 为此,您应该在工作人员角色的配置中分配一个本地磁盘。该磁盘将是一个逻辑磁盘,在您运行 vm 的机器内的本地物理磁盘上创建。换句话说,它将附加存储并且非常适合这种类型的使用。
  • 您的 vm 实例和存储之间的带宽为每核 100Mbps。因此,在小型实例上抓取一个 10MB 的文件可能需要一秒钟。在 XL 上,可能大约十分之一秒。非常快,并且因 VM 系列(A、D、G)和尺寸而异。
  • 因为您的文件位于 blob 存储中,如果您愿意这样做(或有此需要),您可以在上传更新版本之前拍摄快照。快照就像您存储的数据块的链接列表。直到有一天,您对现有数据进行更改(现在您将拥有代表新旧数据的块)之前,快照是免费的。一种在 blob-by-blob 基础上保留 blob 版本的绝妙方法(删除快照很简单)。

只是为了确保这个下载/修改/上传模式清晰,这里有一个非常简单的例子(我只是在 Visual Studio 中快速输入了这个,但没有测试它。只是想说明这一点):

        // initial setup
        var acct = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        var client = acct.CreateCloudBlobClient();

        // what you'd call each time you need to update a file stored in a blob
        var blob = client.GetContainerReference("mycontainer").GetBlockBlobReference("myfile.txt");
        using (var fileStream = System.IO.File.OpenWrite(@"path\myfile.txt"))
        {
            blob.DownloadToStream(fileStream);
        }

        // ... modify file...

        // upload modified file
        using (var fileStream = System.IO.File.OpenWrite(@"path\myfile.txt"))
        {
            blob.UploadFromStream(fileStream);
        }
于 2013-06-12T05:56:32.753 回答