我有以下方法可以返回目录中的文件列表:
public IEnumerable<FileInfo> GetFilesRecursiveEnumerable(DirectoryInfo dir)
{
if (dir == null) throw new ArgumentNullException();
IList<FileSystemInfo> files = new List<FileSystemInfo>();
try
{
files = dir.GetFileSystemInfos();
}
catch (UnauthorizedAccessException) { } //ignore
catch (PathTooLongException)
{
MessageBox.Show("Path too long in directory: " + dir.FullName);
}
foreach (FileSystemInfo x in files)
{
DirectoryInfo dirInfo = x as DirectoryInfo;
if (dirInfo != null)
{
foreach (FileInfo f in GetFilesRecursiveEnumerable(dirInfo))
{
yield return f;
}
}
else
{
FileInfo fInfo = x as FileInfo;
if (fInfo != null) yield return fInfo;
}
}
}
此方法会阻止 GUI。我想在后台线程中运行它(仅限单个),以便在FileSystemInfo
对象可用时将其提供给调用者。
我已经能够让这个方法在后台工作人员中运行并返回一个ICollection
of FileSystemInfo
s - 但这会返回整个列表,而我想在找到项目时产生它们。
编辑
似乎我可能需要重新评估我想要实现的目标(也许这需要回调而不是 IEnumerable)
本质上,我希望索引一个驱动器价值的文件,但我想在后台线程中运行它。这样,我可以逐个文件处理(可能是 Dir by Dir),如果需要,我可以在稍后阶段恢复该过程。如此有效,我希望调用者(GUI 线程)运行此方法,但在目录扫描期间收到通知,而不是在其完全完成时收到通知。例如,
//My original thoughts, but maybe need to tackle this a different way
public void ScanDrive()
{
foreach(FileInfo f in GetFilesRecursiveEnumerable())
{
//index file
//record the directory I am up to so I can resume later
/Keeping my application responsive to perform other tasks
}
}