Question

Trying to convert some VB to C#... (learning C#, too). I have some code that loops through files in a directory and retrieves their file information. I have this originally in VB, but am trying to learn C#, and the online convertors don't give me code that will pass .net 2.0.

Here is the error: Type and identifier are both required in a foreach statement

Here is the code I have:

DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
FileInfo[] files = null;
files = dirInfo.GetFiles();

FileInfo f = default(FileInfo);
foreach (f in files) {  ...
}

I tried putting foreach(FileInfo f... but it gives me a different error: A local variable named 'f' cannot be declared in this scope because it would give a different meaning to 'f', which is already used in a 'parent or current' scope to denote something else

How do I fix it?

Was it helpful?

Solution

DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
FileInfo[] files = null;
files = dirInfo.GetFiles();

// I removed the declaration of f here to prevent the name collision.
foreach (FileInfo f in files)
{  ...
}

Here is a simpler version of the code:

DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
foreach (FileInfo f in dirInfo.GetFiles())
{
}

OTHER TIPS

Here's where it looks like you're going wrong:

FileInfo f = default(FileInfo);
foreach (f in files) {  ...
}

You are defining f outside of the loop, and then attempting to define it within the loop.

If you need the default to be f, try this:

FileInfo f = default(FileInfo);
foreach (FileInfo file in files)
    {
         relevant code here
    }

Otherwise delete the statement declaring the variable "f"

You should provide type of variable used inside loop. In your case it will be FileInfo. But with C# 3.0 or later you can just write var and compiler will infer type for you:

foreach (FileInfo f in files) 
{  
   // ...
}

Read more about foreach statement here.

Complete solution (you don't need to initialize iteration variable and array of files):

DirectoryInfo dir = new DirectoryInfo(currentDir);
foreach (FileInfo file in dir.GetFiles()) 
{
   // use file  
}

This should work:

        DirectoryInfo dirInfo = new DirectoryInfo(currentDir);
        FileInfo[] files = null;
        files = dirInfo.GetFiles();
        foreach (FileInfo f in files)
        {
        }

Edit:

This would be cleaner, in my opinion:

        foreach (FileInfo f in new DirectoryInfo(currentDir).GetFiles())
            {
            }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top