Отладка метода GetAllFilesAndDirectories, когда есть пустые подкаталоги - PullRequest
1 голос
/ 10 октября 2009

Этот метод работает для получения файлов, каталогов и подкаталогов и их содержимого, если только один из подкаталогов окажется пустым.

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;
            }
        }

}

Исключение составляет:

System.InvalidOperationException не обработано Сообщение = "Стек пуст." Источник = "Система"

Есть идеи как исправить?

Ответы [ 4 ]

1 голос
/ 12 октября 2009

Изменить || в && в вашем цикле while.

0 голосов
/ 10 октября 2009

Я могу предложить этот код:

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);
    }
}

Это отобразит:

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)

Если вы хотите List<>, просто вызовите .ToList() метод

0 голосов
/ 12 октября 2009
while (stack.Count > 0)

ваше время работает со стеком.
даже когда вы начинаете собирать данные из подкаталога, стек не пуст.

но когда вы собираете данные из пустого подкаталога и подкаталога в конце списка каталогов, ваш стек пуст и нет причин для продолжения поиска.
полный фиксированный код:

    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;
            }
        }
    }
0 голосов
/ 10 октября 2009

Я добавил еще один ответ на вопрос , который вы задали недавно , что поможет вам избежать этого, потому что вы будете использовать совсем другой (и более легкий для чтения) фрагмент кода, чем тот, который вы ' Использую здесь.

Однако, чтобы сэкономить время на поиск, ознакомьтесь с этой статьей о другом способе рекурсивного чтения файлов / каталогов.

http://support.microsoft.com/kb/303974

Я понимаю, что это не ответ на этот конкретный вопрос, но зачем тратить время на исправление неисправного решения, когда есть совершенно жизнеспособное решение, с которым легче иметь дело?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...