A
Andrew Matthews
Hi All,
I have the following little class of iterators that allow me to iterate over
elements in the file system. I have nested some of them, and then added Func<FileInfo,
bool> delegates to filter out unwanted files. I get an InvalidProgramException
and haven't (yet) been able to find out what's going on. Do you have any
ideas?
TIA
Andrew Matthews
========================================
public class FsIter
{
public static IEnumerable<DirectoryInfo> SubDirectories(DirectoryInfo
di)
{
yield return di;
foreach (DirectoryInfo directory in di.GetDirectories())
{
foreach (DirectoryInfo subDirectory in SubDirectories(directory))
{
yield return subDirectory;
}
}
}
public static IEnumerable<FileInfo> AllFilesUnder(DirectoryInfo d)
{
foreach (DirectoryInfo dir in SubDirectories(d))
{
foreach (FileInfo fileInfo in dir.GetFiles())
{
yield return fileInfo;
}
}
}
public static IEnumerable<FileInfo> MatchingFilesUnder(Func<FileInfo,
bool> x, DirectoryInfo d)
{
foreach (FileInfo fileInfo in AllFilesUnder(d))
{
if (x(fileInfo))
yield return fileInfo;
}
}
public static IEnumerable<FileInfo> FilesByExtension(string ext,
DirectoryInfo d)
{
Func<FileInfo, bool> test = x=>x.Extension==ext;
return Match(test, AllFilesUnder(d));
}
public static IEnumerable<IT> Match<IT>(Func<IT, bool> test, IEnumerable<IT>
col)
{
foreach (IT it in col)
{
if(test(it))
yield return (it);
}
}
}
I tried to exercise it with the following:
[Test]public void TestIterateTestDir2()
{
string testdir = @"C:\etc\dev\fstags\src\UnitTests\tests";
List<FileInfo> files = new List<FileInfo>(FsTags.Core.FsIter.FilesByExtension(".txt",
new DirectoryInfo(testdir)));
Assert.AreEqual(files.Count, 4);
}
And I got the following:
System.InvalidProgramException: Common Language Runtime detected an invalid
program.
at FsTags.Core.FsIter.FilesByExtension(String ext, DirectoryInfo d)
at fstags.UnitTests.TestFsIter.TestIterateTestDir2() in TestFsIter.cs:line
26
I am running C# 3.0 May CTP (LINQ preview) and ReSharper 2.0 (2005)
I have the following little class of iterators that allow me to iterate over
elements in the file system. I have nested some of them, and then added Func<FileInfo,
bool> delegates to filter out unwanted files. I get an InvalidProgramException
and haven't (yet) been able to find out what's going on. Do you have any
ideas?
TIA
Andrew Matthews
========================================
public class FsIter
{
public static IEnumerable<DirectoryInfo> SubDirectories(DirectoryInfo
di)
{
yield return di;
foreach (DirectoryInfo directory in di.GetDirectories())
{
foreach (DirectoryInfo subDirectory in SubDirectories(directory))
{
yield return subDirectory;
}
}
}
public static IEnumerable<FileInfo> AllFilesUnder(DirectoryInfo d)
{
foreach (DirectoryInfo dir in SubDirectories(d))
{
foreach (FileInfo fileInfo in dir.GetFiles())
{
yield return fileInfo;
}
}
}
public static IEnumerable<FileInfo> MatchingFilesUnder(Func<FileInfo,
bool> x, DirectoryInfo d)
{
foreach (FileInfo fileInfo in AllFilesUnder(d))
{
if (x(fileInfo))
yield return fileInfo;
}
}
public static IEnumerable<FileInfo> FilesByExtension(string ext,
DirectoryInfo d)
{
Func<FileInfo, bool> test = x=>x.Extension==ext;
return Match(test, AllFilesUnder(d));
}
public static IEnumerable<IT> Match<IT>(Func<IT, bool> test, IEnumerable<IT>
col)
{
foreach (IT it in col)
{
if(test(it))
yield return (it);
}
}
}
I tried to exercise it with the following:
[Test]public void TestIterateTestDir2()
{
string testdir = @"C:\etc\dev\fstags\src\UnitTests\tests";
List<FileInfo> files = new List<FileInfo>(FsTags.Core.FsIter.FilesByExtension(".txt",
new DirectoryInfo(testdir)));
Assert.AreEqual(files.Count, 4);
}
And I got the following:
System.InvalidProgramException: Common Language Runtime detected an invalid
program.
at FsTags.Core.FsIter.FilesByExtension(String ext, DirectoryInfo d)
at fstags.UnitTests.TestFsIter.TestIterateTestDir2() in TestFsIter.cs:line
26
I am running C# 3.0 May CTP (LINQ preview) and ReSharper 2.0 (2005)