此方法用于获取文件、目录和子目录及其内容,除非其中一个子目录恰好为空。
public static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories ( string dir ) {
DirectoryInfo dirInfo = new DirectoryInfo( dir );
Stack<FileSystemInfo> stack = new Stack<FileSystemInfo>();
stack.Push( dirInfo );
while ( dirInfo != null || stack.Count > 0 ) {
FileSystemInfo fileSystemInfo = stack.Pop();
DirectoryInfo subDirectoryInfo = fileSystemInfo as DirectoryInfo;
if ( subDirectoryInfo != null ) {
yield return subDirectoryInfo;
foreach ( FileSystemInfo fsi in subDirectoryInfo.GetFileSystemInfos() ) {
stack.Push( fsi );
}
dirInfo = subDirectoryInfo;
} else {
yield return fileSystemInfo;
dirInfo = null;
}
}
}例外情况是:
堆栈未处理“Stack Message=”。Source=“系统”
有什么办法解决这个问题吗?
发布于 2009-10-10 04:43:43
我向question you asked a little while ago添加了另一个答案,它将帮助您避免这种情况,因为您将使用与这里使用的完全不同(且更容易阅读)的代码。
但是,为了节省您查找的时间,请参阅本文,了解递归读取文件/目录的不同方法。
http://support.microsoft.com/kb/303974
我知道这不是这个特定问题的答案,但是当有一个更容易处理的完全可行的解决方案时,为什么还要花费时间来修复一个有but的解决方案呢?
发布于 2009-10-12 01:44:30
在while循环中将||更改为&&。
发布于 2009-10-12 01:41:49
while (stack.Count > 0)您的while正在与堆栈一起工作。
即使您开始从子目录收集数据,堆栈也不是空的。
但是当你从空的子目录和目录列表末尾的子目录进行收集时,你的堆栈是空的,没有理由继续搜索。
完整的固定代码是:
public static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories(string dir)
{
DirectoryInfo dirInfo = new DirectoryInfo(dir);
Stack<FileSystemInfo> stack = new Stack<FileSystemInfo>();
stack.Push(dirInfo);
while (stack.Count > 0)
{
FileSystemInfo fileSystemInfo = stack.Pop();
DirectoryInfo subDirectoryInfo = fileSystemInfo as DirectoryInfo;
if (subDirectoryInfo != null)
{
yield return subDirectoryInfo;
foreach (FileSystemInfo fsi in subDirectoryInfo.GetFileSystemInfos())
{
stack.Push(fsi);
}
}
else
{
yield return fileSystemInfo;
}
}
}https://stackoverflow.com/questions/1547061
复制相似问题