Console.Write写大量字符串异常
来源:互联网 发布:vb调用ocx 编辑:程序博客网 时间:2024/06/06 18:50
Console.Write写大量字符串异常
Console.Write 大约写2G字符后就会抛出
Must complete Convert() operation or call Encoder.Reset() before calling GetBytes() or GetByteCount(). Encoder ‘Chinese Simplified (GB2312)’ fallback ‘System.Text.InternalEncoderBestFitFallback’.
必须首先完成 Convert() 操作或调用 Encoder.Reset(),然后才能调用 GetBytes() 或 GetByteCount()。 编码器; 简体中文(GB2312)”回退; System.Text.InternalEncoderBestFitFallback”。
从堆栈上来是System.Text.DBCSCodePageEncoding.GetBytes函数执行出错!所以这个bug并不仅仅影响Console.Write,对于写文本文件(StreamWriter)同样会出现! 在网上搜索了一下,似乎亚洲字符都有这个问题,Big5 日文JIS都存在相关的提问,用vs2005和vs2008测试了一下,都存在这个问题.
解决方案
1.
当使用StreamWriter.Write等类似的文件流写入函数时,获取文件大小,当接近2G时,关闭流,以追加方式打开继续写
2.使用WriteConsole取代Console.Write,示例如下:
public static class ConsoleEx
{
public static IntPtr OutHandle
{
get
{
if (outHandle == IntPtr.Zero)
outHandle = GetStdHandle(StdHandle.STD_OUTPUT_HANDLE);
return outHandle;
}
}
public static void Write(string value)
{
if (OutHandle == IntPtr.Zero)
return;
int numberOfCharsWritten;
char[] valueArray = value.ToCharArray();
WriteConsole(outHandle, valueArray, valueArray.Length, out numberOfCharsWritten, 0);
}
public static void Write(string format, params Object[] arg)
{
Write(string.Format(format, arg));
}
public static void WriteLine(string value)
{
Write(value);
Write(Environment.NewLine);
}
public static void WriteLine(string format, params Object[] arg)
{
Write(format, arg);
Write(Environment.NewLine);
}
enum StdHandle
{
STD_INPUT_HANDLE = -10,
STD_OUTPUT_HANDLE = -11,
STD_ERROR_HANDLE = -12
}
[System.Runtime.InteropServices.DllImport(Kernel32.dll)]
static extern IntPtr GetStdHandle(StdHandle nStdHandle);
[System.Runtime.InteropServices.DllImport(Kernel32.dll)]
static extern int WriteConsole(
IntPtr hConsoleOutput,
char[] lpBuffer,
int nNumberOfCharsToWrite,
out int lpNumberOfCharsWritten,
int lpReserved
);
static IntPtr outHandle = IntPtr.Zero;
}
- Console.Write写大量字符串异常
- Console.Write和Console.WriteLine
- console.write 与response.write
- Console.Write()与Console.WriteLine()的区别
- Console.read()、Console.readline()、Console.readkey()和Console.Write()、Console.Writeline()的区别
- Console.read()、Console.readline()、Console.readkey()和Console.Write、Console.Writeline()的意思
- C#编程中Console.Write()和Console.WriteLine()的区别
- C#中Console.WriteLine(),Console.Write()的用法
- C#入门——Console.Write()与Console.WriteLine()
- Write debug output to console window
- 合并写(write combining )
- HBase write写优化
- ajax解析大量字符串
- Console.WriteLine 字符串格式
- 使用Reflector反射.NET源码比较Console.Write(char[].ToString()) 与Console.Write(char[])
- console.log(123.toString())异常
- 挂机console异常错误分析
- Write-Through(透写)和Write-Back(回写).
- 回收系统_对内存管理的提出新算法.
- 组织行为学对项目管理的意义:动机理论
- 杭电ACM 1229 还是A+B
- JSP获取当前时间
- 杭电ACM 1339 A Simple Task
- Console.Write写大量字符串异常
- 工作一年有余,以后的路该怎么走
- struts2 实现中文文件名的文件下载
- 滚动窗口绘制 鼠标点击坐标与绘制坐标 设备坐标和逻辑坐标
- Linux 内核开发-笔记
- Hibernate多表查询显示数据到jsp
- 如何访问本地搭建的FTP服务器
- 用户管理的备份(一致性备份、非一致性备份、脱机备份、联机备份)
- hdu 1024 最大m子段和