user2385057
user2385057

Reputation: 537

read IEnumerable text list and issue move commands C#

I am trying to read a list in text file and move the files source to target directory. But as I am trying to read this file using for statement it's giving me following error :

foreach statement cannot operate on variables of type System.IO.StreamReader because System.IO.StreamReader does not contain a public definition for GetEnumerator

Not sure if this is issue with file creation or some alternate approach is needed here to read and then move files.

Please advise.

Here's the code:

static void Main(string[] args)
{

    create_source_fileList();
    string source_dir = System.Configuration.ConfigurationSettings.AppSettings["SourceDir"];

    string target_dir = System.Configuration.ConfigurationSettings.AppSettings["TargetDir"];

    string dpath = target_dir + "Diff" + ".txt";

    TextWriter df = new StreamWriter(dpath);

    DirectoryInfo sourceinfo = new DirectoryInfo(source_dir);

    DirectoryInfo targetinfo = new DirectoryInfo(target_dir);

    string[] source_f_list  = File.ReadAllLines(target_dir + "Source_File_List.txt");
    string[] target_f_list = File.ReadAllLines(target_dir + "Target_File_List.txt");

    IEnumerable<String> file_list_diff = source_f_list.Except(target_f_list);

    string diff_list = string.Join(Environment.NewLine, file_list_diff);


    df.WriteLine(string.Join(Environment.NewLine, file_list_diff));
    df.Close();


    System.IO.StreamReader file_read = new System.IO.StreamReader(target_dir + "\\Diff.txt");


    if (!Directory.Exists(targetinfo.FullName))
    {
        Directory.CreateDirectory(targetinfo.FullName);
    }



    /*foreach (FileInfo fi in sourceinfo.GetFiles())

    {

            fi.CopyTo(Path.Combine(targetinfo.ToString(), fi.Name), true);
    }*/



    foreach (string file in file_read)  // Error With For Loop
    {


    }

    create_target_fileList();

}

Upvotes: 0

Views: 170

Answers (1)

Jon Skeet
Jon Skeet

Reputation: 1503090

Yes, you can't use foreach directly with StreamReader. It doesn't have the required members for foreach to work.

Options:

  • Use File.ReadLines instead:

    string path = Path.Combine(targetDir, "Diff.txt");
    foreach (string file in File.ReadLines(path))
    {
        // ...
    }
    
  • Repeatedly call ReadLine on your StreamReader, which should be in a using statement and is simply obtained using File.OpenText:

    string path = Path.Combine(targetDir, "Diff.txt");
    using (TextReader reader = File.OpenText(path))
    {
        string file;
        while ((file = reader.ReadLine()) != null)
        {
            // ...
        }
    }
    

Note that I've made the variable names a bit cleaner too - idiomatic variable names in C# are things like sourceFileList rather than source_f_list.

Additionally, I'd encourage you to use File.WriteAllText earlier on, rather than the way you're using df (without a using statement, and opening it much earlier than you need to).

Upvotes: 4

Related Questions