我正在尝试使用以下方法将zip文件转换为文本文件(xml)。它适用于较小的文件,但似乎不适用于大于50 mb的文件。
mouseover
我有一个.zip文件,大小约为120 MB,我得到了
调用class Program
{
public static void Main(string[] args)
{
try
{
string importFilePath = @"D:\CorpTax\Tasks\966442\CS Publish error\CSUPD20180604L.zip";
int maxLengthInMb = 20;
byte[] payLoad = File.ReadAllBytes(importFilePath);
int payLoadInMb = (payLoad.Length / 1024) / 1024;
bool splitIntoMultipleFiles = (payLoadInMb / maxLengthInMb) > 1;
int payLoadLength = splitIntoMultipleFiles ? maxLengthInMb * 1024 * 1024 : payLoad.Length;
if (splitIntoMultipleFiles)
{
foreach (byte[] splitPayLoad in payLoad.Slices(payLoadLength))
{
ToXml(payLoad);
}
}
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
public static string ToXml(byte[] payLoad)
{
using (XmlStringWriter xmlStringWriter = new XmlStringWriter())
{
xmlStringWriter.WriteStartDocument();
xmlStringWriter.Writer.WriteStartElement("Payload");
xmlStringWriter.Writer.WriteRaw(Convert.ToBase64String(payLoad));
xmlStringWriter.Writer.WriteEndElement();
xmlStringWriter.WriteEndDocument();
return xmlStringWriter.ToString();
}
}
}
时使用System.OutOfMemoryException
。
所以我继续将字节数组拆分为20 mb的块,希望它不会失败。但是我看到它可以工作直到它循环3次,即能够转换60mb的数据,并且在第4次迭代中我遇到了相同的异常。有时候,我在返回xmlStringWriter.ToString()的行上也得到了异常。
要分割字节[],我使用了以下扩展类
Convert.ToBase64String()
我从以下链接获得了上面的代码 Splitting a byte[] into multiple byte[] arrays in C#
有趣的是,当我在控制台应用程序中运行该程序时,它运行良好,但是当我将此代码放入Windows应用程序时,它会抛出public static class ArrayExtensions
{
public static T[] CopySlice<T>(this T[] source, int index, int length, bool padToLength = false)
{
int n = length;
T[] slice = null;
if (source.Length < index + length)
{
n = source.Length - index;
if (padToLength)
{
slice = new T[length];
}
}
if (slice == null) slice = new T[n];
Array.Copy(source, index, slice, 0, n);
return slice;
}
public static IEnumerable<T[]> Slices<T>(this T[] source, int count, bool padToLength = false)
{
for (var i = 0; i < source.Length; i += count)
{
yield return source.CopySlice(i, count, padToLength);
}
}
}
。
答案 0 :(得分:1)
喜欢您想做这样的事情
byte[] Packet = new byte[4096];
string b64str = "";
using (FileStream fs = new FileStream(file, FileMode.Open))
{
int i = Packet.Length;
while (i == Packet.Length)
{
i = fs.Read(Packet, 0, Packet.Length);
b64str = Convert.ToBase64String(Packet, 0, i);
}
}
使用该b64str,您应该创建xml数据。 同样,一次分配20mb的堆栈通常是不明智的。