Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当存在空子目录时调试GetAllFilesAndDirectories方法_C#_File_Directory - Fatal编程技术网

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(字符串目录)
{