CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

大文本文件的读取与写入

楼主daci(daci)2006-12-31 23:35:32 在 .NET技术 / C# 提问

问题:现有一大文本文件预计300M,无法直接读入内存处理,现在的想法是每次从这个文件中读取n行进行处理,处理后其中的部分行需要再存入一个新的文本,估计这个新的文本也有几十M,那我怎么才能不把整个文件读入内存还能够每次读取n行呢?怎样才能都将n行的处理结果追加到新文本中呢?  
  最后祝大家新年快乐! 问题点数:100、回复次数:68Top

1 楼peterb(基础的重要性!!! 去处浮躁 静,思,学!)回复于 2006-12-31 23:37:40 得分 0

upTop

2 楼ustbwuyi()回复于 2006-12-31 23:46:59 得分 0

我晕,什么文本这么大啊?  
  每次读取N行貌似也不好处理,这么大个文本不能拆开么?Top

3 楼daci(daci)回复于 2006-12-31 23:51:21 得分 0

现在的问题是能够处理就可以,不追求速度!我每次读N行也就是为了拆开处理阿Top

4 楼mapserver(杨东 http://mapserver.cnblogs.com)回复于 2007-01-01 00:00:23 得分 0

新年快乐Top

5 楼maliang00111(存时间入瓶)回复于 2007-01-01 00:06:29 得分 0

我晕....天下无敌巨无霸的文本   300M~~~~Top

6 楼daci(daci)回复于 2007-01-01 00:10:06 得分 0

不大了,我刚才看到人家一下读1.5g进去,也不知道怎么读的Top

7 楼shrinerain(圣影雨)回复于 2007-01-01 00:13:29 得分 0

300M...  
  我经常处理几个G的文本文件...  
   
  StreamReader读就好了Top

8 楼daci(daci)回复于 2007-01-01 00:19:29 得分 0

to   shrinerain(圣影雨),俄的神阿,能贴点code吗?是一次子就读进去然后进行处理吗?Top

9 楼fish_yht(百行孝为先,万业勤为径。)回复于 2007-01-01 00:30:53 得分 0

观注+学习Top

10 楼daci(daci)回复于 2007-01-01 09:14:13 得分 0

自己UPTop

11 楼yan63(silence like a cancer grows)回复于 2007-01-01 10:05:25 得分 0

http://www.csdn.net/develop/Article/25/25337.shtmTop

12 楼ice_frank(回归......)回复于 2007-01-01 10:10:50 得分 0

UPTop

13 楼liujia_0421(SnowLover)回复于 2007-01-01 10:36:34 得分 0

你的意思是每一行都有一个处理结果吗?  
   
  Top

14 楼liujia_0421(SnowLover)回复于 2007-01-01 10:54:44 得分 20

小弟学C#不久,写一个,仅供参考..  
   
  static   void   Main(string[]   args)  
                  {  
                          StreamReader   sr   =   new   StreamReader(new   FileStream(@"C:\test\input.txt",   FileMode.Open));  
                          StreamWriter   sw   =   new   StreamWriter(new   FileStream(@"C:\test\output.txt",   FileMode.Append));  
                          while   (sr.Peek()   >   0)  
                          {  
                                  //计数器  
                                  int   count   =   0;  
                                  //用一个列表存储读出的N行,相当于一个缓冲  
                                  ArrayList   list   =   new   ArrayList();  
                                  while   (sr.Peek()   >   0   &&   count   <   10)  
                                  {  
                                          //每次读10行  
                                          list.Add(sr.ReadLine());  
                                          count++;  
                                  }  
                                  //对读出的10行(有可能小于10),进行处理  
                                  foreach   (string   str   in   list   )  
                                  {  
                                          //比如截取每个字符串的第一个字符,然后写入文件中  
                                          sw.Write(str.Substring(0,   1));  
                                  }  
                                  sw.Flush();  
                          }  
                          sr.Close();  
                          sw.Close();                    
                  }Top

15 楼shrinerain(圣影雨)回复于 2007-01-01 12:23:54 得分 20

在Codeproject上搜索CSVReader,是你想要的东西...Top

16 楼daci(daci)回复于 2007-01-01 22:15:06 得分 0

TO   liujia_0421(SnowLover):按照这个意思我完全可以一次把300M数据读进内存咯,那也不同再每次读N行进行处理,直接处理岂不是更好?Top

17 楼daci(daci)回复于 2007-01-01 22:16:35 得分 0

TO   shrinerain(圣影雨):看了一下没完全看懂  
  <PRE   lang=cs>using   System.IO;  
  using   LumenWorks.Framework.IO.Csv;  
   
  void   ReadCsv()  
  {  
          //   open   the   file   "data.csv"   which   is   a   CSV   file   with   headers  
          using   (CsvReader   csv   =  
                        new   CsvReader(new   StreamReader("data.csv"),   true))  
          {  
                  int   fieldCount   =   csv.FieldCount;  
                  string[]   headers   =   csv.GetFieldHeaders();  
   
                  while   (csv.ReadNextRecord())  
                  {  
                          for   (int   i   =   0;   i   <   fieldCount;   i++)  
                                  Console.Write(string.Format("{0}   =   {1};",  
                                                              headers[i],   csv[i]);  
   
                          Console.WriteLine();  
                  }  
          }  
  }</PRE>  
  这里面的意思好像也是直接把所有的数据读进内存然后处理,是吗?Top

18 楼maliang00111(存时间入瓶)回复于 2007-01-01 22:21:54 得分 0

TO:liujia_0421(SnowLover)    
  哇   都两颗星了还自称小弟   太谦虚喽~~Top

19 楼liujia_0421(SnowLover)回复于 2007-01-01 22:27:05 得分 0

TO:按照这个意思我完全可以一次把300M数据读进内存咯,那也不同再每次读N行进行处理,直接处理岂不是更好?  
   
  不好意思,可能我理解有误..  
   
  再帮你关注一下..Top

20 楼liujia_0421(SnowLover)回复于 2007-01-01 22:28:57 得分 0

TO:哇   都两颗星了还自称小弟   太谦虚喽~~  
   
  星多只能代表分多,不能说明什么问题..  
   
  确实刚转C#没多久,正在努力学习中..  
   
  请各位不吝指教,谢谢..  
   
  呵呵..  
  Top

21 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 09:11:53 得分 10

using   System.IO;  
  using   System.Text;  
   
  string   pathSrc   =   ......;//原文件路径  
  string   pathDes   =   ......;//目标文件路径  
  StreamReader   sr   =   new   StreamReader(pathSrc,   Encoding.Default);//读取  
  StreamWriter   sw   =   new   StreamWirter(pathDes,   true,   Encoding.Default);//写入,使用追加模式  
  string   temp;//临时字符串  
  string   StringBuilder   sb   =   new   StringBuilder();  
  const   int   COUNT   =   100;  
  int   index   =   0;  
  while((temp   =   sr.ReadLine)   !=   null)//每次读一行,如果读出的字符串不为空  
  {  
          //在这里对temp进行处理  
          ......  
          //处理完了  
          sb.Append(temp);  
          if(++index   >=   COUNT)  
          {  
                  sw.WriteLine(temp);  
          }  
  }  
  sr.Close();//释放资源  
  sw.Close();//释放资源Top

22 楼terryshi(terryshi)回复于 2007-01-02 09:13:13 得分 0

曾经打开过一个600m的文本,当时死掉Top

23 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 09:14:26 得分 10

不好意思,上面那个有误,少了两行代码。  
  下面这个可以了  
  using   System.IO;  
  using   System.Text;  
   
  string   pathSrc   =   ......;//原文件路径  
  string   pathDes   =   ......;//目标文件路径  
  StreamReader   sr   =   new   StreamReader(pathSrc,   Encoding.Default);//读取  
  StreamWriter   sw   =   new   StreamWirter(pathDes,   true,   Encoding.Default);//写入,使用追加模式  
  string   temp;//临时字符串  
  string   StringBuilder   sb   =   new   StringBuilder();//缓冲  
  const   int   COUNT   =   100;//每次处理100行  
  int   index   =   0;  
  while((temp   =   sr.ReadLine)   !=   null)//每次读一行,如果读出的字符串不为空  
  {  
          //在这里对temp进行处理  
          ......  
          //处理完了  
          sb.Append(temp);  
          if(++index   >=   COUNT)  
          {  
                  sw.WriteLine(sh.ToString());  
                  index   =   0;//索引置零  
                  sb.Length   =   0;//缓冲置零  
          }  
  }  
  sr.Close();//释放资源  
  sw.Close();//释放资源Top

24 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 09:28:39 得分 10

不好意思,还是有问题,上面的不会处理最后不足100行的数据。  
  另外,下面这个改了级算方法。  
  using   System.IO;  
  using   System.Text;  
   
  string   pathSrc   =   ......;//原文件路径  
  string   pathDes   =   ......;//目标文件路径  
  StreamReader   sr   =   new   StreamReader(pathSrc,   Encoding.Default);//读取  
  StreamWriter   sw   =   new   StreamWirter(pathDes,   true,   Encoding.Default);//写入,使用追加模式  
  string   temp;//临时字符串  
  string   StringBuilder   sb   =   new   StringBuilder();//缓冲  
  const   int   COUNT   =   1000000;//每次处理字符串长度最少1百万(大约在1M~2M字节之间)  
  while((temp   =   sr.ReadLine)   !=   null)//每次读一行,如果读出的字符串不为空  
  {  
          //在这里对temp进行处理  
          ......  
          //处理完了  
          sb.Append(temp);  
          sb.Append(Environment.NewLine);//增加换行符  
          if(sb.Length   >=   COUNT)  
          {  
                  sw.Write(sh.ToString());  
                  sb.Length   =   0;//缓冲置零  
          }  
  }  
  if(sb.Length   >   0)//处理最后不足限制的字节  
  {  
          sw.Write(sh.ToString());  
          sb.Length   =   0;//缓冲置零  
  }  
  sr.Close();//释放资源  
  sw.Close();//释放资源  
  Top

25 楼liujia_0421(SnowLover)回复于 2007-01-02 10:07:55 得分 0

楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..Top

26 楼xjjdanran(何流)回复于 2007-01-02 10:13:58 得分 0

都是高手,学习  
  纠正一下,楼主的这句应该是笔误?  
  sw.Write(sh.ToString());    
  ——》sw.Write(sb.ToString());Top

27 楼liujia_0421(SnowLover)回复于 2007-01-02 10:18:52 得分 10

对于IO操作,读和写时,具体是如何利用的内存,这些内在的东西我确实有点不大明白..  
   
  就像我上面写的..  
   
  static   void   Main(string[]   args)  
                  {  
                          StreamReader   sr   =   new   StreamReader(new   FileStream(@"C:\test\input.txt",   FileMode.Open));  
                          StreamWriter   sw   =   new   StreamWriter(new   FileStream(@"C:\test\output.txt",   FileMode.Append));  
                          while   (sr.Peek()   >   0)  
                          {  
                                  //计数器  
                                  int   count   =   0;  
                                  //用一个列表存储读出的N行,相当于一个缓冲  
                                  ArrayList   list   =   new   ArrayList();  
                                  while   (sr.Peek()   >   0   &&   count   <   10)  
                                  {  
                                          //每次读10行  
                                          list.Add(sr.ReadLine());  
                                          count++;  
                                  }  
                                  //对读出的10行(有可能小于10),进行处理  
                                  foreach   (string   str   in   list   )  
                                  {  
                                          //比如截取每个字符串的第一个字符,然后写入文件中  
                                          sw.Write(str.Substring(0,   1));  
                                  }  
                                  sw.Flush();  
                          }  
                          sr.Close();  
                          sw.Close();                    
                  }  
   
  我最初我想法是,打开文件,读出文件中的N行再进行处理,放到一个ArrayList中,然后当计数达到N时,再对ArrayList进行操作,写入另外一个文件..  
   
  后来楼主说到和直接全部读入内存还是一个效果,想了一下,感觉也确实是..  
   
  对于如何读写大文本文件,我也查了些资料,没有一个明确的答案,建议用FileStream读取的比较多,可以用Read方法:  
   
  public   override   int   Read   (  
  [InAttribute]   [OutAttribute]   byte[]   array,  
  int   offset,  
  int   count  
  )  
   
  当然也仅供参考..Top

28 楼liujia_0421(SnowLover)回复于 2007-01-02 10:23:24 得分 0

对于IO操作读写时对内存的分配相关,如果哪位大哥有比较权威的资料,希望能提供给小弟,我也借此机会学习一下,谢谢..  
   
  也可能我的理解有误,小弟也刚步入C#学习不久,正在努力学习中..Top

29 楼ice_frank(回归......)回复于 2007-01-02 12:05:32 得分 0

学习Top

30 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 13:53:23 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

31 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 13:53:30 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

32 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 13:53:42 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

33 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 13:53:52 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

34 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 13:54:01 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

35 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 13:55:04 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

36 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 14:12:41 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

37 楼liujia_0421(SnowLover)回复于 2007-01-02 21:05:58 得分 0

呵呵,谢谢mobydick(敌伯威|我排著队拿著爱的号码牌)   大哥的指点..  
   
  小弟初学C#,以后还请多多指教..Top

38 楼caitian6()回复于 2007-01-02 21:56:09 得分 0

markTop

39 楼guichuan()回复于 2007-01-02 23:19:01 得分 0

UPTop

40 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 23:20:05 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-1-2   10:07:56     得分:   0      
     
     
         
  楼上写的和我写的似乎也差不多,好像也不能满足楼主的要求..  
   
       
     
  =====================================  
  还是我的程序结构容易理解一些,而且更省内存。  
  你的程序中使用了Peek以及记数器,有可能造成初学者的困惑。  
  而且你在程序中使用了ArrayList,单从效率角度讲,ArrayList内都是Object对象,就造成了每次访问对象时的拆箱装箱(box,unbox)操作,肯定降低了效率。  
  我使用的是StringBuilder,这是专门为大字符串操作所设计的类,对字符串操作进行过优化。Top

41 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 23:20:44 得分 0

。。。。。。我KAO,csdn有病,我重复发帖啊。Top

42 楼mobydick(敌伯威|我排著队拿著爱的号码牌)回复于 2007-01-02 23:21:40 得分 0

liujia_0421(SnowLover)   (   )   信誉:100         Blog     2007-01-02   21:05:58     得分:   0      
     
     
        呵呵,谢谢mobydick(敌伯威|我排著队拿著爱的号码牌)   大哥的指点..  
   
  小弟初学C#,以后还请多多指教..  
       
     
  ==============================================  
  一起学习啊~~~Top

43 楼Radar2006(中华英雄)回复于 2007-01-03 09:22:28 得分 0

疯了Top

44 楼ilove8(千里|你去哪里了,我等了你很久了!)回复于 2007-01-03 09:34:14 得分 0

markTop

45 楼dychenyi()回复于 2007-01-03 12:03:32 得分 0

学习学习   很好Top

46 楼Eri(NULL)回复于 2007-01-03 15:40:00 得分 0

关注Top

47 楼hdj_05(过河卒)回复于 2007-01-03 16:17:31 得分 0

学习Top

48 楼simonllf(simon)回复于 2007-01-03 16:39:14 得分 0

markTop

49 楼evane1890()回复于 2007-01-03 16:52:03 得分 0

其实很简单,原理就是  
  1。打开文件   abc.txt   用来读,efg.txt用来保存处理后的数据  
  2。用字符流来一行一行读,你的目的是要从abc.txt中读到数据并处理,处理完后就直接写入另一个文件efj.txt,  
  3。关闭文件  
   
  如果你要分析的数据是以段落区分的,那你就用可能随机读取文件的流就行了,  
   
  别说你不知道用什么流啊!  
  那你要好好再学习学习了:)Top

50 楼yulinlover(黑客我最菜)回复于 2007-01-03 17:26:08 得分 10

引入临时文件,加异步来处理,要不容易使程序挂掉!  
  不过处理的数据最好不要在界面上显示,要不draw的时候也要死,我早就写过这个东西,一直实现不了,我就想UE(ultra   edit)为什么处理大文件,几十M文件(再大的没试过),不管怎么批量编辑,都是那么快!真是好!看来VC++操作起来更有效率!  
   
  我都是这样的:写个框架吧:  
   
  string   strInput=@"c:\file.input";  
  string   strOutput=@"c:\file.input";  
   
  public   void   ReadLargeFile()  
  {  
  byte[]   btsReadBuffer=new   byte[1024*8];  
   
  //异步开始读取文件内容  
  FileStream     fsRead=new   FileStream(strInput,FileMode.Open,FileAccess.Read,FileShare.Write);  
  if(fsRead.CanRead)  
  {  
  fsRead.BeginRead(btsReadBuffer,0,btsReadBuffer.Length,new   AsyncCallback(Callback_ReadFile),fsRead);  
  }  
  else  
  {  
  fsRead.Close();  
  throw   new   ApplicationException("Current   Stream   Couldn't   Read!");  
  }  
  }  
   
  ///   <summary>  
  ///   异步读取文件后所进行的操作  
  ///   </summary>  
  ///   <param   name="ar"></param>  
  public   void   Callback_ReadFile(IAsyncResult   ar)  
  {  
  FileStream   fsRead=null;  
  FileStream   fsWrite=null;  
   
  byte[]   btsWriteBuffer=new   byte[1024*8];  
  fsRead=(FileStream)ar.AsyncState;  
  int   intReadCount=fsRead.EndRead(ar);  
  if(intReadCount>0)  
  {  
  string   strReadContent=Encoding.Default.GetString(btsReadBuffer,0,btsReadBuffer.Length);  
  //这里放处理代码  
  //.....  
  //....  
   
  btsWriteBuffer=Encoding.Default.GetBytes(strReadContent);  
  fsWrite=new   FileStream(strOutput,FileMode.OpenOrCreate,FileAccess.Write,FileShare.Read);  
  if(fsWrite.CanWrite)  
  {  
  fsWrite.BeginWrite(btsWriteBuffer,0,btsWriteBuffer.Length,new   AsyncCallback(Callback_WriteFile),fsWrite);  
  }  
  else  
  {  
  fsWrite.Close();  
  throw   new   ApplicationException("Current   Stream   Couldn't   Write!");  
  }  
  }  
  else  
  {  
  fsRead.Close();  
  return;  
  }  
  fsRead.BeginRead(tbp1_GlobalData.btsBuffer,0,tbp1_GlobalData.btsBuffer.Length,new   AsyncCallback(Callback_ReadFile),fsRead);  
  }  
   
   
  public   void   Callback_WriteFile(IAsyncResult   ar)  
  {  
  FileStream   fsWrite=null;  
  try  
  {  
  fsWrite=(FileStream)ar.AsyncState;  
  fsWrite.EndWrite(ar);  
  fsWrite.Close();  
  }  
  catch(Exception   ex)  
  {  
  fsWrite.Close();  
  throw   ex;  
  }  
  }  
   
  里面的一些抓错代码,全省略了,凑合看了!Top

51 楼yulinlover(黑客我最菜)回复于 2007-01-03 17:28:55 得分 0

对不住了,好多地方没有注释,不过各位肯定能看明白的,呵呵,这个只是框架而已!  
   
  整个过程,是对一个文件,边打开读取,边打开写,这就是为什么用FileShare.Read   或   FileShare.Write的原因了!Top

52 楼bejon(阿牛[如果我懂,必坦诚相告;如果您懂,请不吝赐教。])回复于 2007-01-03 17:50:57 得分 10

vb的做法:  
                  FileOpen(1,   "c:\1.txt",   OpenMode.Input)  
                  Dim   str1   As   String,   i   As   Int16  
                  For   i   =   0   To   10000  
                          If   EOF(1)   Then   Exit   For  
                          str1   =   LineInput(1)  
                          '处理一行文本的代码  
                  Next  
                  FileClose(1)  
  Top

53 楼Qiao_caT(乔乔)回复于 2007-01-03 17:53:49 得分 0

yulinlover(黑客我最菜)  
  20M搞定了么???呵呵~~Top

54 楼yulinlover(黑客我最菜)回复于 2007-01-03 17:57:23 得分 0

搞定了,刚开始为了那个问题,搞了N久!Top

55 楼yulinlover(黑客我最菜)回复于 2007-01-03 17:59:11 得分 0

 
  不过对于在RichTextBox里处理那个东西,还是不行,因为要不断的进行Draw,跟UE相比,慢得多了!Top

56 楼xiaoliangwh(!!!)回复于 2007-01-03 22:59:28 得分 0

upTop

57 楼min_jie(止戈)回复于 2007-01-04 09:11:38 得分 0

关注。。Top

58 楼a6598132()回复于 2007-01-04 09:16:30 得分 0

关注Top

59 楼liujia_0421(SnowLover)回复于 2007-01-04 09:33:56 得分 0

几天不见,都顶到这里来啦?  
   
  再顶下..Top

60 楼Red_angelX(八戒)回复于 2007-01-04 09:53:40 得分 0

1.   FS中2G以下的都能直接读,如果你觉得速度慢界面无响应,可以使用线程或者异步  
  2.   你是否选错了语言,我以前在X公司做数据统计,动不动就是G,T的数量级,当时用bash,根本没算法就是强行读,让*nix跑个几小时甚至一天Top

61 楼daci(daci)回复于 2007-01-06 23:43:26 得分 0

大家好热情啊,谢谢,  
  我按照liujia_0421(SnowLover)的想法尝试了一下,但没有分组处理,直接全部读进来然后处理,用了个300M左右的文件,发现不是传说中的死机,晕,莫非我过虑了?  
  按照shrinerain(圣影雨)提供的codeproject代码来看,他也是直接读进来的  
  莫非可以读没有问题?Top

62 楼xomix(小狼羔)回复于 2007-01-07 00:46:28 得分 0

想到了复制临时文件,一边读取(很少的行)一边删除(对应的行数)的办法…………  
  不知道对LZ会不会有帮助……Top

63 楼wshuangminlg(这里有你想要的 http://31767702.qzone.qq.com/)回复于 2007-01-09 17:15:36 得分 0

收~~~Top

64 楼tjuyyf(皮皮)回复于 2007-01-09 17:22:37 得分 0

顶这个,^_^,Top

65 楼viena(维也纳N02)回复于 2007-01-09 17:41:32 得分 0

没细看所有回复,但每次读一行然后处理是没有问题的  
  系统不会傻到读一行就把内部缓冲区扔掉  
  决不可一次性读到内存!否则会使用虚存(页面交换文件,又写回硬盘了),导致频繁读写,效率极其低下!Top

66 楼rainyubin(成不了牛人!)回复于 2007-01-09 17:58:07 得分 0

星,三角,红色,绿色,分别代表什么意思?Top

67 楼rainyubin(成不了牛人!)回复于 2007-01-09 17:58:33 得分 0

我才是一个绿三角!!!Top

68 楼ayun00(阿云)回复于 2007-01-22 02:08:19 得分 0

StreamWriter   不能写大于4k的字符   怎么解决Top

相关问题

关键词

得分解答快速导航

  • 帖主:daci
  • liujia_0421
  • shrinerain
  • mobydick
  • mobydick
  • mobydick
  • liujia_0421
  • yulinlover
  • bejon

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo