How to get FileInfo via a foreach Loop?
-
07-06-2021 - |
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?
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())
{
}