5

我想知道如何读取位于服务器上的多个(大约 500-1000 个)文本文件。到目前为止,我已经为一个只读取单个文本文件的程序编写了代码。

这是我目前正在阅读单个文件的方式。

  public void button1_Click(object sender, EventArgs e)
    {
        // Reading/Inputing column values



        OpenFileDialog ofd = new OpenFileDialog();
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {

            string[] fileLines = File.ReadAllLines(ofd.FileName);

我想摆脱打开文件对话框,让程序自动读取服务器中的500-1000个文本文件。

我在想一些事情

  for (int i =0; i<numFiles; i++)
  {
     //just use string[] fileLines =File.ReadAllLines()
     //how would i specify the path for multiple files?
  }

那么问题是:

  1. 我将如何处理这个?
  2. 我应该如何获得文件的数量?
    (我猜我必须阅读包含它们的服务器文件。)
4

3 回答 3

2

您可以使用Directory.GetFiles(string path)从某个目录获取所有文件。然后,您可以使用 foreach 循环遍历该目录中的所有文件并进行处理。

于 2013-11-07T19:08:48.693 回答
1

如何获取文件取决于它们是否都位于同一目录中,以及是否需要递归搜索目录和所有子目录。Directory.GetFiles 是您要开始的地方。这里有 3 个重载。所以你可以尝试这样的事情:

string path = "\mypath\tosomehwere";
string searchPattern = "*.txt";
string[] MyFiles = Directory.GetFiles(path, searchPattern, SearchOption.AllDirectories);

然后像往常一样遍历字符串数组并处理每个文件。

foreach (string filePath in MyFiles)
{
      MyFileProcessMethod(filePath)
} 

Path.GetFileName(filePath)如果您需要它来满足您的处理要求,将返回单个文本文件名。

于 2013-11-07T19:27:09.823 回答
1

您可以使用递归遍历所有目录。使用Directory.EnumerateFiles还允许您使用foreach循环,因此您不必担心文件数。

    private static void ReadAllFilesStartingFromDirectory(string topLevelDirectory)
    {
        const string searchPattern = "*.txt";
        var subDirectories = Directory.EnumerateDirectories(topLevelDirectory);
        var filesInDirectory = Directory.EnumerateFiles(topLevelDirectory, searchPattern);

        foreach (var subDirectory in subDirectories)
        {
            ReadAllFilesStartingFromDirectory(subDirectory);//recursion
        }

        IterateFiles(filesInDirectory, topLevelDirectory);
    }

    private static void IterateFiles(IEnumerable<string> files, string directory)
    {
        foreach (var file in files)
        {
            Console.WriteLine("{0}", Path.Combine(directory, file));//for verification
            try
            {
                string[] lines = File.ReadAllLines(file);
                foreach (var line in lines)
                {
                    //Console.WriteLine(line);   
                }
            }
            catch (IOException ex)
            {
                //Handle File may be in use...                    
            }
        }
    }

另请注意Directory.EnumerateFiles提供重载,使您可以提供搜索模式来缩小文件的范围。

于 2013-11-07T19:30:39.840 回答