Rafik Bari
Rafik Bari

Reputation: 5037

How to write list<String> to a text file?

How can append f to a list each time, then write the list into a text file ? I tried with the following code but the text file is always empty?

  static void DirSearch(string dir, string pattern)
    {
        try
        {
            List<String> filesList = new List<string>();

            foreach (string f in Directory.GetFiles(dir, pattern))
            //Console.WriteLine(f);
            {
                // Console.WriteLine(f); // // <- This works correctly
                filesList.Add(f);
            }
            foreach (string d in Directory.GetDirectories(dir))
            {
                //Console.WriteLine(d); 
                DirSearch(d, pattern);
            }

            File.WriteAllLines("files.txt", filesList.ToArray());

        }
        catch (System.Exception ex)
        {
            //Console.WriteLine(ex.Message);
        }
    }

Upvotes: 1

Views: 2996

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1503489

I suspect the problem is that on each invocation of DirSearch, you're overwriting the file output from previous invocations. If the final invocation has no files (only directories) you'll end up with an empty file.

Options:

  • Use Directory.GetFiles(dir, pattern, SearchOption.AllDirectories so you don't need to use recursion at all.
  • Use File.AppendAllLines instead of File.WriteAllLines
  • Build up the list entirely in memory (recursively) and only at the very end call File.WriteAllLines.

The latter approach would look something like this:

public static DirSearch(string dir, string pattern)
{
    List<string> files = new List<string>();
    DirSearchImpl(dir, pattern, files);
    File.WriteAllLines("files.txt", files);
}

private static DirSearchImpl(string dir, string pattern, List<string> files)
{
    // Simpler than your previous loop...
    files.AddRange(Directory.GetFiles(dir, pattern));
    foreach (var subdirectory in Directory.GetDirectories(dir))
    {
        DirSearchImpl(subdirectory, pattern, files);
    }
}

I'd also suggest changing your exception handling - catching Exception is rarely a good idea, and I'm not sure you really want to keep going if things fail, do you?

Upvotes: 3

Related Questions