当Convert.ToBase64String()时出现System.OutofMemoryException错误

时间:2018-07-26 21:41:31

标签: c# .net

我正在尝试使用以下方法将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); } } }

1 个答案:

答案 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的堆栈通常是不明智的。