我正在将图片文件转换为base64字符串,以便将它们存储在.txt文件中,然后检索它们并将它们重新转换为图像。在这样做的过程中,我代表我的StringBuilder
发现了一个有趣的错误行为:
// **Example A, uses StringBuilder**
String[] filePaths = Directory.GetFiles(folderPath, "*.*");
StringBuilder sb = new StringBuilder();
ImageConverter converter = new ImageConverter();
StreamWriter sw = File.CreateText(filepathBase64);
foreach (String item in filePaths)
{
try
{
Bitmap picture = new Bitmap(item);
Byte[] byteArr = (Byte[])converter.ConvertTo(picture, typeof(Byte[]));
String base64 = Convert.ToBase64String(byteArr);
sb.AppendLine(base64);
}
catch { }
}
StreamWriter sw = File.CreateText(filepathBase64);
sw.Write(sb);
sw.Flush();
sw.Close();
这会创建一个.txt文件,其中包含base64中的大量行和一个与我的Stringbuilder一起使用的.AppendLine的最后一行空行。当我稍后读取这些base64字符串并将它们转换回图像对象时,我必须小心这最后一行以避免异常,所以我检查它是这样的:
//**Example A.1, checking for empty string
listBoxbilder.Items.Clear();
String[] myArr = File.ReadAllLines(filepathBase64);//last item will be empty string
foreach (String item in myArr)
{
if (item != String.Empty) //This is my validation
{
byte[] decodedFromBase64 = Convert.FromBase64String(item);
BitmapImage myImage = new BitmapImage();
myImage.BeginInit();
myImage.StreamSource = new MemoryStream(decodedFromBase64);
myImage.EndInit();
ListBoxItem bild = new ListBoxItem();
bild.Content = new System.Windows.Controls.Image() { Source = myImage };
listBoxbilder.Items.Add(bild);
}
}
现在,如果我使用稍微不同的版本执行相同的任务,使用我的StreamWriter
直接写入我的文件,而不是打扰使用StringBuilder
,则生成的.txt看起来与肉眼,但代码行为不同。这是创建文件的位:
//**Example B, just uses StreamWriter**
String[] filePaths = Directory.GetFiles(folderPath, "*.*");
ImageConverter converter = new ImageConverter();
StreamWriter sw = File.CreateText(filepathBase64);
foreach (String item in filePaths)
{
try
{
Bitmap picture = new Bitmap(item);
Byte[] byteArr = (Byte[])converter.ConvertTo(picture, typeof(Byte[]));
String base64 = Convert.ToBase64String(byteArr);
sw.WriteLine(base64);
}
catch{ }
}
sw.Flush();
sw.Close();
我的文件末尾仍然有一个空行,但是当我使用File.ReadAllLines将该文件读入数组时,我没有得到一个数组,其中最后一个位置是一个空字符串。怎么会?我现在可以使用代码而不检查空白,如下所示:
//**Example B.1, no checks
listBoxbilder.Items.Clear();
String[] myArr = File.ReadAllLines(filepathBase64);
foreach (String item in myArr)
{
byte[] decodedFromBase64 = Convert.FromBase64String(item);
BitmapImage myImage = new BitmapImage();
myImage.BeginInit();
myImage.StreamSource = new MemoryStream(decodedFromBase64);
myImage.EndInit();
ListBoxItem bild = new ListBoxItem();
bild.Content = new System.Windows.Controls.Image() { Source = myImage };
listBoxbilder.Items.Add(bild);
}
我没有得到异常,因为File.ReadAllLines产生的数组没有包含空字符串的位置,但.txt源看起来相同,最后有一个空行。造成这种不同行为的原因是什么?
答案 0 :(得分:0)
效果消失了。我不知道黑魔法,宇宙辐射或简单的疏忽,我的部分之前造成了这种不稳定的行为,它不会再发生了。生成的文件具有相同的字节数和相同的校验和,当我在程序中使用它们时,它们的行为相同。