遍历一个文件夹(其中包括遍历子文件夹),把其中所有以“zkjg”开头的txt文件读出,需要取每个txt文件的每一行中的特定数据(每一行以逗号分割)。
目前的做法是先定义一个文本文件的集合,再循环这个集合对其中的文本文件进行操作。
foreach(遍历文件夹和子文件夹)
   文本集合;//取得文本集合
然后
foreach(遍历文本集合)
   对每个文本进行操作;问题是,当文本文件数量较多,文本文件中数据较大时,运行出现程序未响应状态,过很长时间才恢复,此时结果也出来了。请问如何修改性能?谢谢!

解决方案 »

  1.   

    其实,这种操作永远快不了,因为你其中还涉及到了磁盘操作。还要去读取磁盘中的文件内容。当然了,在一定的程度上面是可以加速一下,首先,遍历文件夹的时候,在 getfiles这个函数里面使用文件后缀参数,可以得到某一种文件类型,比方说*.txt然后尽量使用线程,而不要跟默认的线程在一起,这样给用户的感觉能够好上一点。最后,可以按照用户的机器来设置多个线程,比方说给用户一个输入框让他可以输入需要几个线程同时进行
      

  2.   

    需要注意几个问题:
    1.文件打开后一定要关闭并释放资源,建议使用using(XXXXXXXXXX){}的方式
    2.如果是顺序读取文件,必然耗时,可以考虑多线程的方式,这样一次可以读多个文件
    3.结合你的应用,你可以考虑使用SQL server 中的SSIS
    4.读文件时要按流的方式,不要一下把文件内容全部载入内存
    提示一个方案:
    1.C#中有一个方法可以直接搜索文件,好像是Directory.GetFiles("*sdf*.txt")。
    2.把上面的文件数组分成多份,并分别在多个线程中遍历。
    3.做一个全局变量,让每个线程根据遍历情况更新。
    4.界面上进行不断刷新来读取上面的全局变量,这样虽然运行慢,但用户可以了解进度。
      

  3.   

    试一下不要一次把文件全部读入,而是使用相关Reader类一次一行行的读,比如用StreamReader,这样起码可以使用Application.DoEvents来响应一下程序的其它消息处理,不至于死机。
      

  4.   

    多线程调用它算了:foreach(遍历文本集合) 
                        对每个文本进行操作;