谢谢!dudu。
上面这个参考文章我研究一下。在程序不退出的情况下第二次重复执行时发生的。这个是什么原因?
请问dudu,如果采用Stream 去把Base64 字符串还原成原来的文档咋操作?
@新手123456: 建议提供相关代码
@dudu: 请教一下帮忙看看,谢谢!
整个功能是从一个比较大的XML文件里读取某个节点的值是经过编码的Base64字符串。然后将这个读取到的Base64 字符串还原成原始文件。在这个读取与还原的整个函数执行过程中,如果遇到多个150M以上的XML文件 执行行时函数会在执行到第二个或者第三个读取XML文件Load时或者读取节点值(ele.GetAttribute("FILENAME");)时报System.OutOfMemoryException异常错误。
函数如下:
private void UnZip()
{
try
{
//this.xmlfilePath.Text 是窗体上测试时 使用选择执行XML文件的路径
using (Stream stream = File.OpenRead(this.xmlfilePath.Text))
{
string filename = string.Empty;
XmlDocument doc = new XmlDocument();
doc.Load(stream);
stream.Close();
stream.Dispose();
XmlNode node = doc.DocumentElement.SelectSingleNode("ATTACHMENT");
XmlElement ele = (XmlElement)node;
filename = ele.GetAttribute("FILENAME");
var contents = Convert.FromBase64String(ele.InnerText.Trim());
using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
fs.Write(contents, 0, contents.Length);
fs.Flush();
fs.Dispose();
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally {
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
}
}
@新手123456: 建议使用 XmlReader ,试试下面的代码
private static void UnZip()
{
try
{
//this.xmlfilePath.Text 是窗体上测试时 使用选择执行XML文件的路径
var xmlFilePath = this.xmlfilePath.Text;
using (XmlReader reader = XmlReader.Create(xmlFilePath))
{
while (reader.Read())
{
if (reader.NodeType.Equals(XmlNodeType.Element))
{
if (reader.Name == "ATTACHMENT")
{
string filename = reader.GetAttribute("FILENAME");
var contents = Convert.FromBase64String(reader.ReadInnerXml().Trim());
using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write))
{
fs.Write(contents, 0, contents.Length);
}
break;
}
}
}
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
file -read-> stream -base64-> base64Stream -write-> file or network stream.
base64Stream -base64-> stream -read-> string.
stream原理就是 分段;既然大了 自己分段读分段写不就搞定了。