我在调用streamreader.readtoend()读一个有四百多K的文件时,程序报System.OutOfMemoryException异常,请问各位大侠怎样处理?

解决方案 »

  1.   

    写一个大文件读取类
    public class FileSplitSteamReader : FileStream
        {
            #region //文件分块读
            /// <summary>
            /// 用于普通文件读取
            /// </summary>
            /// <param name="sourceFileName">文件的路径</param>
            public FileSplitSteamReader(string sourceFileName)
                : base(sourceFileName, FileMode.Open, FileAccess.Read)
            {
                this.sourceFileName = sourceFileName;
            }
            /// <summary>
            /// 用于大文件读取
            /// </summary>
            /// <param name="sourceFileName">文件的路径</param>
            /// <param name="splitSize">切分大小</param>
            public FileSplitSteamReader(string sourceFileName, int splitSize)
                : base(sourceFileName, FileMode.Open, FileAccess.Read)
            {
                this.sourceFileName = sourceFileName;
                this.splitSize = splitSize;
            }        private string sourceFileName;
            /// <summary>
            /// 获取文件的路径
            /// </summary>
            public string SourceFileName
            {
                get { return sourceFileName; }
            }        private long splitSize;
            /// <summary>
            /// 每次切分文件大小splitSize
            /// </summary>
            public long SplitSize
            {
                get { return splitSize; }
            }        /// <summary>
            /// 文件的大小
            /// </summary>
            public long FileSize
            {
                get { return this.Length; }
            }        private long readTimes = 1;
            /// <summary>
            /// 当前读取次数块号
            /// </summary>
            public long ReadTimes
            {
                get { return readTimes; }
            }        private bool judge = false;
            /// <summary>
            /// 用于判断是否执行到最后一块.读完为ture,未读完为false.
            /// </summary>
            public bool Judge
            {
                get { return judge; }
                set { judge = value; }
            }        /// <summary>
            /// 最后一次读取文件的大小
            /// </summary>
            public long FinilReadSize
            {
                get
                {
                    if (splitSize == 0)
                        return 1024 * 1024 * 3;
                    else
                        return this.FileSize - (this.FileSize / (long)this.splitSize) * (long)this.splitSize;            }
            }
            public int CurrentReadSize;
            /// <summary>
            /// 开始读取文件
            /// </summary>
            /// <returns>以Bitmap类型返回每次读取文件的内容</returns>
            public byte[] SpliteRead()
            {
                FileBlockSteamReaderEventArgs Fbsr = new FileBlockSteamReaderEventArgs();
                byte[] timeReadContect;
                this.Seek(splitSize * (readTimes - 1), SeekOrigin.Begin);
                if (readTimes < (this.FileSize / this.splitSize + 1))
                {
                    Fbsr.ReadPercent = (int)(((float)this.Position / this.FileSize) * 100);
                    timeReadContect = new byte[this.splitSize];
                }
                else
                {
                    timeReadContect = new byte[this.FinilReadSize];
                    judge = true;
                    Fbsr.ReadPercent = 100;
                }
                CurrentReadSize = timeReadContect.Length;
                this.Read(timeReadContect, 0, timeReadContect.Length);
                FileABlockReadEndEvent(Fbsr);
                readTimes++;
                return timeReadContect;
            }
            public event EventHandler<FileBlockSteamReaderEventArgs> ABlockReadEndEvent;
            public event EventHandler FinishAllReadEvent;        /// <summary>
            /// 文件读取完当前块当前事件
            /// </summary>
            /// <param name="e"></param>
            public void FileABlockReadEndEvent(FileBlockSteamReaderEventArgs e)
            {
                if (ABlockReadEndEvent != null)
                {
                    this.ABlockReadEndEvent(this, e);
                }
            }
            /// <summary>
            /// 文件读取完最后一块的事件
            /// </summary>
            public void FileFinishAllReadEvent()
            {
                if (FinishAllReadEvent != null)
                {
                    this.FinishAllReadEvent(this, new EventArgs());
                }
            }
            #endregion
        }
    然后,再这么写,我直接用你的东西了
            Common.FileSplitSteamReader filestream = new Common.FileSplitSteamReader(str_file,1000);//1000是我自己设定的每次分割的大小,你自己可以随意设定这个值
            if (File.Exists(str_file))
                bytedata = filestream.SpliteRead();
            else
            {
                return;
            }
            try
            {
                bytedata.Initialize();
                string strdata = Encoding.ASCII.GetString(bytedata);
            }
            catch
            { }
      

  2.   

    FileBlockSteamReaderEventArgs属于哪个命名空间的?
      

  3.   

    找到了不是缺少命名空间引用是少了一个类
    public class FileBlockSteamReaderEventArgs : EventArgs
              {
                  private int readPercent;
                  public int ReadPercent
                  {
                      get { return readPercent; }
                      set { readPercent = value; }
                  }
              }
    添加在上面的#endregion之前就好了