C# 当存在空子目录时调试GetAllFilesAndDirectories方法
此方法用于获取文件、目录和子目录及其内容,除非其中一个子目录恰好为空C# 当存在空子目录时调试GetAllFilesAndDirectories方法,c#,file,directory,C#,File,Directory,此方法用于获取文件、目录和子目录及其内容,除非其中一个子目录恰好为空 public static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories ( string dir ) { DirectoryInfo dirInfo = new DirectoryInfo( dir ); Stack<FileSystemInfo> stack = new Stack<FileSyst
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;
}
}
}
公共静态IEnumerable GetAllFilesandDirectory(字符串目录){
DirectoryInfo dirInfo=新的DirectoryInfo(dir);
堆栈=新堆栈();
stack.Push(dirInfo);
while(dirInfo!=null | | stack.Count>0){
FileSystemInfo FileSystemInfo=stack.Pop();
DirectoryInfo subDirectoryInfo=作为DirectoryInfo的fileSystemInfo;
if(子目录yinfo!=null){
收益返回子目录yinfo;
foreach(子目录yinfo.getFileSystemInfo()中的FileSystemInfo fsi){
堆栈推送(fsi);
}
dirInfo=子目录yinfo;
}否则{
产生返回文件系统信息;
dirInfo=null;
}
}
}
例外情况是:
System.InvalidOperationException未处理
Message=“堆栈为空。”
Source=“系统”
有什么想法可以解决吗?我在中添加了另一个答案,这将帮助您避免这种情况,因为您使用的代码与您在这里使用的代码完全不同(而且更易于阅读) 但是,为了节省查找时间,请参阅本文,了解递归读取文件/目录的另一种方法
我意识到这并不是对这个特定问题的回答,但为什么要花时间来修复一个有缺陷的解决方案,而有一个完全可行的解决方案更容易处理呢?我为添加了另一个答案,这将帮助您避免这个问题,因为您使用的是一个完全不同的解决方案(而且更容易阅读)比您在这里使用的代码少一点 但是,为了节省查找时间,请参阅本文,了解递归读取文件/目录的另一种方法
我意识到这并不是这个特定问题的答案,但既然有一个更容易处理的完全可行的解决方案,为什么还要花时间修复一个有问题的解决方案呢?我可以建议以下代码:
static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories(string path)
{
string currentDirectory = "";
string[] files = Directory.GetFiles( // skip empty subfolders
path, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
if(currentDirectory != Path.GetDirectoryName(file))
{
// First time in this directory: return it
currentDirectory = Path.GetDirectoryName(file);
yield return new DirectoryInfo(currentDirectory);
}
yield return new FileInfo(file);
}
}
static void Main(string[] args)
{
foreach (FileSystemInfo info in GetAllFilesAndDirectories(@"c:\intel"))
{
Console.WriteLine("{0} ({1})", info.FullName, info.Attributes);
}
}
静态IEnumerable GetAllFilesandDirectory(字符串路径)
{
字符串currentDirectory=“”;
string[]files=Directory.GetFiles(//跳过空子文件夹
路径“**”,SearchOption.AllDirectories);
foreach(文件中的字符串文件)
{
if(currentDirectory!=Path.GetDirectoryName(文件))
{
//第一次在此目录中:返回它
currentDirectory=Path.GetDirectoryName(文件);
返回新的DirectoryInfo(currentDirectory);
}
返回新的文件信息(文件);
}
}
静态void Main(字符串[]参数)
{
foreach(GetAllFilesandDirectory(@“c:\intel”)中的文件系统信息)
{
Console.WriteLine(“{0}({1})”,info.FullName,info.Attributes);
}
}
这将显示:
c:\intel\Logs (Directory)
c:\intel\Logs\IntelChipset.log (Archive)
c:\intel\Logs\IntelGFX.log (Archive)
c:\intel\Logs\IntelStor.log (Archive)
c:\intel\ExtremeGraphics\CUI\Resource (Directory)
c:\intel\ExtremeGraphics\CUI\Resource\igfxres.dll (Archive)
c:\intel\Logs(目录)
c:\intel\Logs\IntelChipset.log(存档)
c:\intel\Logs\IntelGFX.log(存档)
c:\intel\Logs\IntelStor.log(存档)
c:\intel\ExtremeGraphics\CUI\Resource(目录)
c:\intel\ExtremeGraphics\CUI\Resource\igfxres.dll(存档)
如果您想要一个
列表
,只需调用.ToList()
方法我可以推荐以下代码:
static IEnumerable<FileSystemInfo> GetAllFilesAndDirectories(string path)
{
string currentDirectory = "";
string[] files = Directory.GetFiles( // skip empty subfolders
path, "*.*", SearchOption.AllDirectories);
foreach (string file in files)
{
if(currentDirectory != Path.GetDirectoryName(file))
{
// First time in this directory: return it
currentDirectory = Path.GetDirectoryName(file);
yield return new DirectoryInfo(currentDirectory);
}
yield return new FileInfo(file);
}
}
static void Main(string[] args)
{
foreach (FileSystemInfo info in GetAllFilesAndDirectories(@"c:\intel"))
{
Console.WriteLine("{0} ({1})", info.FullName, info.Attributes);
}
}
while (stack.Count > 0)
静态IEnumerable GetAllFilesandDirectory(字符串路径)
{
字符串currentDirectory=“”;
string[]files=Directory.GetFiles(//跳过空子文件夹
路径“**”,SearchOption.AllDirectories);
foreach(文件中的字符串文件)
{
if(currentDirectory!=Path.GetDirectoryName(文件))
{
//第一次在此目录中:返回它
currentDirectory=Path.GetDirectoryName(文件);
返回新的DirectoryInfo(currentDirectory);
}
返回新的文件信息(文件);
}
}
静态void Main(字符串[]参数)
{
foreach(GetAllFilesandDirectory(@“c:\intel”)中的文件系统信息)
{
Console.WriteLine(“{0}({1})”,info.FullName,info.Attributes);
}
}
这将显示:
c:\intel\Logs (Directory)
c:\intel\Logs\IntelChipset.log (Archive)
c:\intel\Logs\IntelGFX.log (Archive)
c:\intel\Logs\IntelStor.log (Archive)
c:\intel\ExtremeGraphics\CUI\Resource (Directory)
c:\intel\ExtremeGraphics\CUI\Resource\igfxres.dll (Archive)
c:\intel\Logs(目录)
c:\intel\Logs\IntelChipset.log(存档)
c:\intel\Logs\IntelGFX.log(存档)
c:\intel\Logs\IntelStor.log(存档)
c:\intel\ExtremeGraphics\CUI\Resource(目录)
c:\intel\ExtremeGraphics\CUI\Resource\igfxres.dll(存档)
如果您想要一个列表
,只需调用.ToList()
方法即可
while (stack.Count > 0)
您的while正在使用stack。即使开始从子目录收集,堆栈也不是空的。
但是当您从空的子目录和目录列表末尾的子目录收集数据时,堆栈是空的,没有理由继续搜索。
完整的固定代码为:
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;
}
}
}
公共静态IEnumerable GetAllFilesandDirectory(字符串目录)
{
DirectoryInfo dirInfo=新的DirectoryInfo(dir);
堆栈=新堆栈();
stack.Push(dirInfo);
而(stack.Count>0)
{
FileSystemInfo FileSystemInfo=stack.Pop();
DirectoryInfo subDirectoryInfo=作为DirectoryInfo的fileSystemInfo;
if(子目录yinfo!=null)
{
收益返回子目录yinfo;
foreach(子目录yinfo.getFileSystemInfo()中的FileSystemInfo fsi)
{
堆栈推送(fsi);
}
}
其他的
{
产生返回文件系统信息;
}
}
}
您的while正在使用stack。即使开始从子目录收集,堆栈也不是空的。
但是当您从空的子目录和目录列表末尾的子目录收集数据时,堆栈是空的,没有理由继续搜索。
完整的固定代码为:
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;
}
}
}
公共静态IEnumerable GetAllFilesandDirectory(字符串目录)
{