单线程读文件

代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;
using System.IO;

namespace ExToDB.FileTransfer
{
    
public class FileComsumer
    {
        
private string fileName;
        
private Stream streamOuput = null;
        
private int bufferSize = 1024;

        
private Thread fileThread = null;
        
private volatile bool isStop;

        
public event ReturnEndEvent OnReadEnd;

        
public FileComsumer(string fileName)
        {
            isStop 
= false;
            
this.fileName = fileName;
        }

        
/// <summary>
        
/// 获取读到的Stream
        
/// </summary>
        public Stream StreamOuput
        {
            
get { return streamOuput; }
        }

        
public void Start()
        {
            fileThread 
= new Thread(new ThreadStart(TheadReadFile));
            fileThread.Start();
        }

        
public void Stop()
        {
            isStop 
= true;
            
if (fileThread != null && fileThread.ThreadState == System.Threading.ThreadState.Running)
                fileThread.Abort();
            fileThread 
= null;
        }

        
private byte[] buffer = null;

        
/// <summary>
        
/// 获取读到的数据
        
/// </summary>
        public byte[] Buffer
        {
            
get { return buffer; }
        }

        
private void TheadReadFile()
        {
            streamOuput 
= new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, true);
            
int numBytesToRead = (int)streamOuput.Length;
            
int numBytesRead = 0;
            buffer 
= new byte[streamOuput.Length];
            
while (numBytesToRead > 0 && !isStop)
            {
                
// Read may return anything from 0 to numBytesToRead.
                int n = streamOuput.Read(buffer, numBytesRead, numBytesToRead);
                
// The end of the file is reached.
                if (n == 0)
                {
                    OnOnReadEnd();
                    
break;
                }
                    numBytesRead 
+= n;
                numBytesToRead 
-= n;
                
//读取文件完成,触发事件
                if (numBytesToRead == 0)
                    OnOnReadEnd();
            }
            streamOuput.Close();
        }

        
private void OnOnReadEnd()
        {
            
if(this.OnReadEnd!=null)
                OnReadEnd(
this,new ReturnEndReadEventargs(true));
        }
    }
}
原文地址:https://www.cnblogs.com/csharponworking/p/1644490.html