将大量物理文件名写入文本文件c#

时间:2015-10-15 03:08:44

标签: c# .net

我开发了一个小工具,用于显示c#中的数据差异,我的工作在下面有点说明,

  1. 根据日期条件-output 1
  2. 从数据库中获取数据并在文本文件中写入文件名列表
  3. 获取路径1的dir并写入文件file- output2
  4. 类似地获取path2,path3和path4的dir,并为每个路径输出分别写入文本文件 - 3/4/5
  5. 比较选项:比较output1和2并记下文本文件中的差异,然后将这个差异与output3进行比较,再次将差异写入另一个文件,依此类推......
  6. 我的问题是:我的最后一条路径有超过250万条文件记录,每当我尝试在文本文件中编写它时,它会挂起应用程序并且它从不提供输出,我确实尝试使用日期条件过滤它,但即使是单个文件也是如此记录可能约为3万的日子
  7. 我搜索了很多网站,但没有得到我能理解或能够实现的解决方案。以下是我尝试的代码。

    if (!txtpath3.Text.Equals(String.Empty) && System.IO.Directory.GetFiles(txtpath3.Text).Length > 0)
    {
        var directory = txtpath3.Text;
        var from_dt = this.dtpickerstart.Value;
        var end_dt = this.dtpickerend.Value;
    
        DateTime from_date = from_dt;
        DateTime to_date = end_dt;
    
        DirectoryInfo di = new DirectoryInfo(directory);
        FileSystemInfo[] files = di.GetFileSystemInfos();
    
        var op = di.GetFiles()
            .Where(file => file.LastWriteTime >= from_date && file.LastWriteTime <= to_date);
    
        foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*"))
        {
            TextWriter tw = new StreamWriter(dirfile3, true);
            tw.WriteLine("" + file + "");
            tw.Close();
        }
    }
    else
    {
    
    }
    

2 个答案:

答案 0 :(得分:3)

您的using(var tw = new StreamWriter(dirfile3, true)) { foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*")) { tw.WriteLine("" + file + ""); } } - 循环打开并关闭所有行的文件。您应该在循环外打开和关闭文件。

File.AppendAllLines(dirfile3, System.IO.Directory.GetFiles(txtpath3.Text, "*.*"));

更容易使用已有的功能来执行此操作:

File.AppendAllLines(dirfile3, System.IO.Directory.EnumerateFiles(txtpath3.Text, "*.*"));

由于250万个文件名在RAM中同时存在很多,因此只需枚举它们就可能会更好:

SpriteBatch

答案 1 :(得分:1)

我认为问题出在foreach

foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*"))
{
   TextWriter tw = new StreamWriter(dirfile3, true);
   tw.WriteLine("" + file + "");
   tw.Close();
}

对于许多文件中的每一个,您正在打开一个文件,附加一行,关闭文件,只是再打开它,写另一行等等......

您应该先在字符串中准备好所有内容,然后一次性插入所有文本,例如:

StringBuilder sb = new StringBuilder();
foreach (string file in System.IO.Directory.GetFiles(txtpath3.Text, "*.*"))
{
   sb.AppendLine(file);
}
File.WriteAllText(dirfile3, sb.ToString());