- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近遇到了一个错误,或者至少是通过 .NET
客户端使用的 BlockBlob 的一个非常奇怪的行为。
基本上,写入和刷新的特定组合会损坏文件,如果您在写入后读回它,则响应流包含垃圾(更准确地说,它是截断和最后写入字节的重复)。
重现(100% 机会):
腐败示例:
var iterations = new List<byte[]?>()
{
new byte[] { 0x00 },
new byte[] { 0x00 },
new byte[] { 0x00 },
new byte[] { 0x00 },
null,
new byte[] { 0xFF },
new byte[] { 0xAA },
};
written: 00000000FFAA
read: FFAAFFAA
成功示例:
var iterations = new List<byte[]?>()
{
new byte[] { 0x00 },
new byte[] { 0x00 },
new byte[] { 0x00 },
null,
new byte[] { 0x00 },
new byte[] { 0xFF },
new byte[] { 0xAA },
};
written: 00000000FFAA
read: 00000000FFAA
null
是我调用 Flush 的点这里最奇怪的是,如果您在损坏后再写入 1 个字节,那么损坏就会消失。仅当您的 blob 文件以 write4+flush+write2 序列结尾时才会发生这种情况。
有人见过这样的事情吗?
var containerClient = new BlobContainerClient(connectionSting, "test");
var blockBlobClient = containerClient.GetBlockBlobClient($"test{Guid.NewGuid():N}.data");
var iterations = new List<byte[]?>()
{
new byte[] { 0x00 },
new byte[] { 0x00 },
new byte[] { 0x00 },
new byte[] { 0x00 },
null,
new byte[] { 0xFF },
new byte[] { 0xAA },
};
var writeStream = blockBlobClient.OpenWrite(true, new Azure.Storage.Blobs.Models.BlockBlobOpenWriteOptions()
{
HttpHeaders = new Azure.Storage.Blobs.Models.BlobHttpHeaders()
{
ContentType = "application/octet-stream"
}
});
var writeMemStream = new MemoryStream();
for (var i = 0; i < iterations.Count; i++)
{
var buffer = iterations[i];
if (buffer is null)
{
writeStream.Flush();
writeMemStream.Flush();
}
else
{
writeStream.Write(buffer, 0, buffer.Length);
writeMemStream.Write(buffer, 0, buffer.Length);
}
}
writeStream.Dispose();
var readMemStream = new MemoryStream();
var readStream = blockBlobClient.OpenRead(options: new Azure.Storage.Blobs.Models.BlobOpenReadOptions(false)
{
Position = 0
});
readStream.CopyTo(readMemStream);
readStream.Dispose();
readMemStream.Position = 0;
writeMemStream.Position = 0;
var readArr = readMemStream.ToArray();
var writeArr = writeMemStream.ToArray();
if (!readArr.SequenceEqual(writeArr))
{
System.Console.WriteLine("DIFFERENT");
System.Console.WriteLine(string.Join("", writeArr.Select(q => q.ToString("X2"))));
System.Console.WriteLine(string.Join("", readArr.Select(q => q.ToString("X2"))));
}
else
{
System.Console.WriteLine("SAME");
System.Console.WriteLine(string.Join("", writeArr.Select(q => q.ToString("X2"))));
System.Console.WriteLine(string.Join("", readArr.Select(q => q.ToString("X2"))));
}
最佳答案
https://www.nuget.org/packages/Azure.Storage.Blobs/12.8.3 中也提供了此问题的修复程序。
关于.net - Flush 和 Write 调用的特定组合会损坏通过 OpenWrite 使用的 BlockBlob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67280408/
我正在使用以下内容写入文件: using(Stream FileStream = File.OpenWrite(FileName)) FileStream.Write(Contents, 0,
下面的代码是另一种创建带有 channel 的类的尝试。在这里,我直接从调用方传递一个 channel ,而不是在类中打开它。虽然代码给出了预期的结果,但我想知道这样做是否合法,特别是通过在 new
我正在使用 System.Net.FtpClient 程序集将文件上传到测试 FTP 站点。当我运行下面的代码时,文件不会出现在远程位置,除非我按照下面的方式使用 Thread.Sleep(我不想使用
我最近遇到了一个错误,或者至少是通过 .NET 客户端使用的 BlockBlob 的一个非常奇怪的行为。 基本上,写入和刷新的特定组合会损坏文件,如果您在写入后读回它,则响应流包含垃圾(更准确地说,它
我有以下代码来检测文件是否已在使用: public static bool FileInUse(string sFile) { FileStream file = null; try
我正在使用 DocumentFormat.OpenXml.SpreadsheetDocument 并打开 Excel 文档的模板,对其进行写入并保存。 它的工作原理就像普通文件流的魅力: using
我是一名优秀的程序员,十分优秀!