如何读取给定文件夹中的所有文件?

时间:2011-03-24 22:36:53

标签: c#

下面的程序解析其中一个Dwarf Fortress.的所谓RAW文件。代码工作正常,但是对于我目前的实现,我需要为每个文件运行一次程序,每次手动更改源文件。有没有我可以改为解析给定文件夹中的所有文本文件?

(请注意,当前输出文件与输入文件位于同一文件夹中。我不太确定如果程序试图打开文件时会发生什么,但是这是牢记)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // create reader & open file
            string filePath = @"C:\foo\Dwarf Fortess\creature_domestic.txt";
            string destPath = @"C:\foo\Dwarf Fortess\eggCreatures.txt";
            string line;
            // 
            TextReader tr = new StreamReader(filePath);
            TextWriter tw = new StreamWriter(destPath);

            // read a line of text
            while ((line = tr.ReadLine()) != null) 
            {

                        if (line.Contains("[CREATURE:"))
                        {
                            tw.WriteLine(line);
                        }
                        if(line.Contains("[LAYS_EGGS]"))
                        {
                            tr.ReadLine();
                            tr.ReadLine();
                            tr.ReadLine();
                            tw.WriteLine(tr.ReadLine());
                            tw.WriteLine(tr.ReadLine());
                        }


            }

            // close the stream
            tr.Close();
            tw.Close();
        }
    }
}

3 个答案:

答案 0 :(得分:5)

您可以使用Directory.EnumerateFiles获取目录中的所有文件并循环访问它们。您可以提供搜索规范以及搜索是否应该是递归的,具体取决于您使用的参数和重载。

BTW - 你应该在using语句中包装你的流以确保正确处理:

using(TextReader tr = new StreamReader(filePath))
{
  using(TextWriter tw = new StreamWriter(destPath))
  {
    ....
  }
}

答案 1 :(得分:2)

检查Directory.EnumerateFiles它会列出目录中的所有文件。您可以使用options参数选择是否以递归方式工作。

然后只需加载它为您提供的文件。

答案 2 :(得分:1)

什么版本的.Net?您可以对Directory.GetFiles使用linq来排除您正在写入的文件。我现在没有VS,可能会有一些错误,但你希望得到这个想法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string destPath = @"C:\foo\Dwarf Fortess\eggCreatures.txt";
            FileInfo fiDest = new FileInfo(destPath);
            DirectoryInfo diDF = new DirectoryInfo(@"C:\foo\Dwarf Fortress");

            var files = from FileInfo f in diDF.GetFiles("*.txt")
                where f.Name != fiDest.Name
                select f
            foreach(FileInfo fiRead in files) 
            {

            // create reader & open file
                string filePath = @"C:\foo\Dwarf Fortess\creature_domestic.txt";
                string line;
                // 
                TextReader tr = fiRead.OpenText();
                TextWriter tw = new StreamWriter(destPath);

                // read a line of text
                while ((line = tr.ReadLine()) != null) 
                {

                            if (line.Contains("[CREATURE:"))
                            {
                                tw.WriteLine(line);
                            }
                            if(line.Contains("[LAYS_EGGS]"))
                            {
                                tr.ReadLine();
                                tr.ReadLine();
                                tr.ReadLine();
                                tw.WriteLine(tr.ReadLine());
                                tw.WriteLine(tr.ReadLine());
                            }


                }

                // close the stream
                tr.Close();
                tw.Close();
            }
        }
    }
}