20MB的Text文本,如何多线程读取,我想做的先读取字符并转换为4位ASCII形式,然后每500KB为一份,现在的问题是,单线程就死机,如何多线程读取?
解决方案 »
- ======> 急急急! 300元现金,求验证码识别程序,有现成案例,可供参考.
- c#怎么实现SMTP服务??
- [永恒的话题]asp.net 上传大文件问题,头疼,Krystalware.SlickUpload.dll怎么用呢?
- 关于自动递增字段
- 【★】★【☆】这个C++的东西怎么改写成 C#
- 怎么把dateTimePicker里面的日期存到数据库里去啊?
- 写数据库的程序的时候,是不是用一个数据库的类比较好
- c# attribute问题
- 那里有关于c#数据库方面的书和网站呀
- 关于事件函数button_Click(object sender, System.EventArgs e)的参数
- c# listbox使用
- 请问。webbrower中如何得到网页中的一个Jscript变量的值
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;
}