我刚问了一些错误的问题here。我是Azure的新手,所以请耐心等待。
我在Azure存储帐户中上传了一个文本文件。现在,在我的工作者角色中,我需要做的是每次运行时,它从数据库中获取一些内容,并且该内容必须写在Uploaded中文本文件,具体来说,每次都应该用一些新内容覆盖文本文件的内容。
我想知道,有没有办法修改文本文件,没有通常的方式在本地下载,然后再次修改和上传。
我正在寻找一些方式,比如它的阅读方式,以文本的形式,使用“DownloadToStream”。我的意思是,我们只能在文本文件中上传一些文本流。
答案 0 :(得分:0)
鉴于您的文件结构已修复,让我们举个例子。假设您的文件看起来像这样,每个条目都在一个新行中:
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行。你要做的是将块操作放在第二个块上并提供新内容。提交该块后,您需要再次提交阻止列表。
以下示例代码说明了我上面提到的内容:
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);
答案 1 :(得分:0)
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();