【发布时间】:2023-03-11 06:48:01
【问题描述】:
考虑:
public static void ConvertFileToUnicode1252(string filePath, Encoding srcEncoding)
{
try
{
StreamReader fileStream = new StreamReader(filePath);
Encoding targetEncoding = Encoding.GetEncoding(1252);
string fileContent = fileStream.ReadToEnd();
fileStream.Close();
// Saving file as ANSI 1252
Byte[] srcBytes = srcEncoding.GetBytes(fileContent);
Byte[] ansiBytes = Encoding.Convert(srcEncoding, targetEncoding, srcBytes);
string ansiContent = targetEncoding.GetString(ansiBytes);
// Now writes contents to file again
StreamWriter ansiWriter = new StreamWriter(filePath, false);
ansiWriter.Write(ansiContent);
ansiWriter.Close();
//TODO -- log success details
}
catch (Exception e)
{
throw e;
// TODO -- log failure details
}
}
以上代码对大文件返回内存不足异常,仅适用于小文件。
【问题讨论】:
-
不能逐行做吗?
-
您无需使用 ReadToEnd 阅读全部内容。读取块、转换、写入、重复。
-
使用
foreach(string line in File.ReadLines(filePath)) ... process line ... -
旁注:不要写
throw e;,而只写throw;,您将通过这种方式保持您的堆栈跟踪。请Dispose你的一次性用品(Streams) -
当在具有大量可用内存的机器上看到 OutOfMemoryException 时,这表明 .Net 运行时无法分配足够大的单个连续内存块来满足请求。随着 List
等容器的增长,底层数组的大小每次都会翻倍。我在运行 X86(32 位)代码时看到过这种情况,因为地址空间被限制为 4GB。
标签: c# encoding filestream