【问题标题】:Modify text file in Azure Storage修改 Azure 存储中的文本文件
【发布时间】:2013-06-08 04:09:28
【问题描述】:

我刚刚问了一个错误的问题here。我是 Azure 的新手,请多多包涵。

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

我想知道,有没有一种修改文本文件的方法,而不用通常的方式下载到本地,然后修改再上传。

我正在寻找某种方式,比如阅读方式,以文本的形式,使用“DownloadToStream”。我的意思是,我们不能只在现有的文本文件中上传一些文本流。

【问题讨论】:

  • 你能多描述一下文件的结构吗?文件结构是预定义的还是随机的?当您希望修改文件时,您是希望在随机位置修改文件还是您确切知道需要在哪里修改?
  • 我知道它会在哪里完成......结构也是固定的,它是文本文件,包含单列......

标签: azure azure-storage azure-blob-storage


【解决方案1】:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("*****"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer objContainer = blobClient.GetContainerReference("****");
CloudBlockBlob blob = objContainer.GetBlockBlobReference("file.txt");

string content = blob.DownloadTextAsync().Result + report;
blob.UploadTextAsync(content);
blob.SetProperties();

【讨论】:

  • 请为您的代码正在执行的操作添加更多上下文。
【解决方案2】:

鉴于您的文件结构是固定的,让我们举个例子。假设您的文件看起来像这样,其中每个条目都在一个新行中:

Line1: this is line 1
Line2: this is line 2
Line3: this is line 3
...
...
...

现在,当您上传新文件(假设文件不存在)时,无论文件大小如何,您都需要使用 Put Block 和 Commit Block List 以块的形式上传它们。您要做的是为每一行分配一个块 id(理想情况下,您希望块 id 与行号相同,例如 000001、000002 等)并放置这些行。上传整个文件后,您将提交阻止列表。

接下来要更新文件时,您要做的第一件事就是获取已提交的阻止列表。现在让我们假设您要更改第 2 行。您要做的是将块操作放在第 2 个块上并提供新内容。提交该块后,您需要再次提交该块列表。

这是说明我上面提到的东西的示例代码:

    var storageAccount = new CloudStorageAccount(new StorageCredentials("myaccount", "accountkey"), true);
    var client = storageAccount.CreateCloudBlobClient();
    var container = client.GetContainerReference("mycontainer");
    container.CreateIfNotExists();
    var blob = container.GetBlockBlobReference("so.txt");
    List<string> blockIds = new List<string>();
    for (int i = 0; i < 10; i++)
    {
        int j = i + 1;
        var blockId = Convert.ToBase64String(Encoding.UTF8.GetBytes(j.ToString("d6")));
        blockIds.Add(blockId);
        string content = "Line " + j + ": this is line #" + j + "\r\n";
        using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(content)))
        {
            blob.PutBlock(blockId, ms, null);
        }
    }
    blob.PutBlockList(blockIds);
    int j1 = 2;
    var blockIdNew = Convert.ToBase64String(Encoding.UTF8.GetBytes(j1.ToString("d6")));
    string newContent = "Line " + j1 + ": this is line #" + j1 + " - this is modified.\r\n";
    using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(newContent)))
    {
        blob.PutBlock(blockIdNew, ms, null);
    }
    blob.PutBlockList(blockIds);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-15
    • 2018-11-20
    • 1970-01-01
    • 2019-04-06
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多