20MB的Text文本,如何多线程读取,我想做的先读取字符并转换为4位ASCII形式,然后每500KB为一份,现在的问题是,单线程就死机,如何多线程读取?

解决方案 »

  1.   

    WinForm学习第二帖啊,兄弟们,大哥们,我知道很简单,可是.....我不会。
      

  2.   

    窗体上有5个控件:两个textbox,一个显示文件路径,一个显示需要分割的大小;两个button,一个打开文件对话框,一个开始分割程序;一个进度条。以下是全部代码,自我感觉线程t1没有用,小弟初学,希望大家能指点指点,不胜感激!
    private void button2_Click(object sender, System.EventArgs e)
    {
    Thread t1=new Thread(new ThreadStart(doprogress));
    Thread t2=new Thread(new ThreadStart(split));
    t1.Start();
    t2.Start();
    }
    private void button1_Click(object sender, System.EventArgs e)
    {
    ofdlg.Filter = "*.txt|*.txt";
    ofdlg.ShowDialog();
    if (ofdlg.FileName != "" && ofdlg.FileName != "")
    {
    tbfile.Text = ofdlg.FileName;
    FileInfo fi = new FileInfo(tbfile.Text);
    long mybyte = fi.Length;
    if (mybyte <= 1024)
    {
    lblinfo.Text = "文件大小" + fi.Length + "Byte";
    }
    else if (mybyte >= 1024 * 1024)
    {
    lblinfo.Text = "文件大小" + Math.Round(fi.Length / (float)(1024 * 1024),2) + "MB";
    }
    else
    {
    lblinfo.Text = "文件大小" + Math.Round(fi.Length / (float)1024,2) + "KB";
    }
    }
    }private void doprogress()
    {
    tbfile.Text = ofdlg.FileName;
    FileInfo fi = new FileInfo(tbfile.Text);
    long mybyte =fi.Length/1024; int iFileCount = ( int ) ( mybyte/ Convert.ToInt32(tbsize.Text) ) ; 
    if(mybyte%Convert.ToInt32(tbsize.Text)!=0||iFileCount==0)iFileCount++; progressBar1.Maximum=iFileCount-1;
    progressBar1.Minimum=0;
    }
    private void split()
    {
    int size= Convert.ToInt32(tbsize.Text) *1024 ; 
    //根据选择来设定分割的小文件的大小
    string fp=System.IO.Path.GetFullPath(tbfile.Text);
    //得到文件路径
    string ffn=System.IO.Path.GetFileName(tbfile.Text);
    //得到完整文件名
    string fn=System.IO.Path.GetFileNameWithoutExtension(tbfile.Text);
    //得到文件名
    string fext=System.IO.Path.GetExtension(tbfile.Text);
    //得到扩展名
    string newpath=fp.Remove(fp.Length-ffn.Length,ffn.Length)+"\\"+fn;
    //得到新的存放路径 if ( Directory.Exists ( newpath ) ) 
    {
    Directory.Delete ( newpath ,true ) ; 
    Directory.CreateDirectory ( newpath ) ;
    }
    //如果计算机存在存放分割文件的目录,则全部删除此目录所有文件并新建文件夹
    else
    Directory.CreateDirectory ( newpath ) ;
    //反之则在计算机直接创建目录 FileStream SplitFileStream=new FileStream ( tbfile.Text , FileMode.Open ) ; 
    //以文件的全路对应的字符串和文件打开模式来初始化FileStream文件流实例 BinaryReader SplitFileReader=new BinaryReader ( SplitFileStream ) ; 
    //以FileStream文件流来初始化BinaryReader文件阅读器 byte[] TempBytes ; 
    //每次分割读取的最大数据
    int iFileCount = ( int ) ( SplitFileStream.Length / size ) ; 
    if(SplitFileStream.Length%size!=0||iFileCount==0)iFileCount++;
    //小文件总数
    /* 循环将大文件分割成多个小文件 */
    for ( int i = 1 ; i <= iFileCount ; i++ ) 
    {
    string sTempFileName = newpath+"\\"+fn+i.ToString()+fext; //小文件名
    FileStream TempStream = new FileStream ( sTempFileName , FileMode.Create) ;
    //根据文件名称和文件打开模式来初始化FileStream文件流实例 BinaryWriter TempWriter = new BinaryWriter ( TempStream ) ; 
    //以FileStream实例来创建、初始化BinaryWriter书写器实例  TempBytes = SplitFileReader.ReadBytes ( size ) ;  //从大文件中读取指定大小数据 progressBar1.Value=i-1;
    //改写进度条 TempWriter.Write ( TempBytes ) ; 
    //把此数据写入小文件 TempWriter.Close ( ) ; 
    //关闭书写器,形成小文件 TempStream.Close ( ) ; 
    //关闭文件流
    Thread.Sleep(20);
    }
    SplitFileReader.Close ( ) ; 
    //关闭大文件阅读器
    SplitFileStream.Close ( ) ; 
    MessageBox.Show ( "分割成功!" ) ;
    progressBar1.Value=0;
    }