こんばんは、statemacihneです。Azure Driveの件では、たくさんの方がTwitterで反応してくださってありがとうございます。Blogを更新する励みになるというものです。さて、本日もAzureの時事ネタということで以下より。
CloudBlob.DownloadFile() がバグっていて、既存ファイルに上書きした場合、以前のファイル内容が残ってしまうというものです。
再現コード
自己完結する再現コードは以下の通り(LINQPad向け) 。
- 内容が10文字のBlobをz.txtにダウンロード
- 次に内容が5文字のBlobを既存のz.txtに上書きダウンロード
- 結果をみると、既存ファイルの内容が残る。
- 最後に回避策。
void Main() { var account = CloudStorageAccount.DevelopmentStorageAccount; var client = account.CreateCloudBlobClient(); client.GetContainerReference("test").CreateIfNotExist(); var a = client.GetBlobReference("test/a.text"); var b = client.GetBlobReference("test/b.text"); a.UploadText("1234567890"); b.UploadText("ABCEF"); var output = @"c:\temp\z.txt"; File.Delete(output); // a -> "z.txt" a.DownloadToFile(output); Console.WriteLine("z.txt : " + File.ReadAllText(output)); // b -> "z.txt" b.DownloadToFile(output); Console.WriteLine("z.txt : " + File.ReadAllText(output)); // 回避法 using (var stream = File.Create(output)) { b.DownloadToStream(stream); } Console.WriteLine("z.txt : " + File.ReadAllText(output)); }
実行結果
2行目がバグった結果です。3行目は回避策により正しくダウンロードされた結果。
z.txt : 1234567890 z.txt : ABCEF67890 z.txt : ABCEF
まとめ
開発ストレージでも、Azureでも再現します。Storageライブラリのバグなんで、両環境で再現するのでしょう。また、Storageライブラリがバグったときは、再パッケージが必須っぽいんで、ちと面倒というか。