1

ここで少し場違いな質問 をしました。私は Azure の完全な初心者なので、ご容赦ください。

Azure ストレージ アカウントにアップロードされたテキスト ファイルがあります。今、私のワーカー ロールでは、実行するたびに、データベースからいくつかのコンテンツを取得し、そのコンテンツをアップロードされたテキスト ファイルに書き込む必要があります。具体的には、テキスト ファイルのコンテンツが新しいコンテンツで上書きされるたびに。

知りたいのですが、ローカルにダウンロードしてから再度変更してアップロードする通常の方法を使用せずに、テキスト ファイルを変更する方法はありますか。

「DownloadToStream」を使用して、テキストの形式で読み取る方法など、何らかの方法を探しています。つまり、存在するテキストファイルにテキストストリームをアップロードするだけではいけません。

4

2 に答える 2

0

ファイル構造が固定されていると仮定して、例を見てみましょう。各エントリが新しい行にあるファイルが次のようになっていると仮定します。

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

新しいファイルをアップロードする場合 (ファイルが存在しない場合)、ファイルのサイズに関係なく、Put Block と Commit Block List を使用してブロック単位でアップロードする必要があります。各行にブロック ID を割り当て (理想的には、000001、000002 などの行番号と同じブロック ID を指定します)、それらの行を配置します。ファイル全体がアップロードされたら、ブロック リストをコミットします。

次にファイルを更新する場合、最初に行うことは、コミットされたブロック リストを取得することです。ここで、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);
于 2013-06-12T09:33:37.860 に答える