Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > Общие вопросы .NET
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 19.04.2009, 20:04   #1
LepihinMS
Пользователь
 
Регистрация: 03.02.2007
Сообщений: 45
Вопрос Аналог tree на C# (вывод содержимого каталогов)

Есть в сосаве Windows чуть более чем замечательная консольная программка Tree, выводящая на экран дерево каталогов. Необходимо написать аналогичную программу на C#.

Требования к программе:
На входе: каталог. На выходе: дерево каталогов, начиная от
указанного. Параметр командной строки -f включает режим
отображения еще и файлов.

Думаю, в данной теме задам много вопросов, но пока он один:

Как научить программу захватывать параметры командной строки?
LepihinMS вне форума Ответить с цитированием
Старый 19.04.2009, 21:53   #2
neomichi
Пользователь
 
Регистрация: 26.03.2009
Сообщений: 43
По умолчанию воть

у события main параметры для этого есть

Код:
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            bool q = false;
            String parametr="null";
            foreach (string s in args)
            {
                if (q == true) { parametr = s; break; }
                if (s.Equals("-f"))
                {
                    q = true;
                }
            }
            Console.WriteLine(parametr);
            Console.ReadKey();
        }
    }
}
учти что еще нужно наверное граммотно парсить и тп...

чтоб дерево замутить, юзай рекурсию =)

Последний раз редактировалось neomichi; 20.04.2009 в 09:11.
neomichi вне форума Ответить с цитированием
Старый 30.04.2009, 09:53   #3
diomercury
 
Регистрация: 30.04.2009
Сообщений: 7
Радость

Что-то как-то замудрено, имхо. Так, вроде, логичнее.

Код:
static void Main(string[] args)
{
    bool showFiles = false;
    String startFolder = null;
    switch (args.Length)
    {
        case 1:
            startFolder = args[0];
            break;

        case 2:
            if (args[0].equals("-f"))
            {
                startFolder = args[1];
            }
            else if (args[1].equals("-f"))
            {
                startFolder = args[0];
             }
            else
            {
                // неверные параметры
                return;
            }
            showFiles = true;
            break;

        default:
            // неверное число параметров
            return;
    }
}
diomercury вне форума Ответить с цитированием
Старый 30.04.2009, 15:01   #4
neomichi
Пользователь
 
Регистрация: 26.03.2009
Сообщений: 43
По умолчанию

ну..у меня все равно проще) и компактнее

Последний раз редактировалось neomichi; 30.04.2009 в 22:18.
neomichi вне форума Ответить с цитированием
Старый 13.05.2009, 20:41   #5
LepihinMS
Пользователь
 
Регистрация: 03.02.2007
Сообщений: 45
По умолчанию

Параметры получил. Спасибо neomichi. Спасибо diomercury.

Сейчас пытаюсь собрать Полные Имена всех подкаталогов директории, подкаталоги подкаталогов директории и так далее. Полистал справочник нашел способ получить Полные Имена подкаталогов только текущей директории:

Код:
static void Main(string[] args)
        {
            string Koren = @"C:\Program Files";

            DirectoryInfo Test = new DirectoryInfo(Koren);
            DirectoryInfo[] Podkat = Test.GetDirectories();

            foreach (DirectoryInfo d in Podkat)
                Console.WriteLine("{0}",d.FullName);
            
            Console.ReadLine();
        }
Вижу только один способ получить все имена - заходить в каждый подкаталог, получать его подкаталоги и т.д. Есть ли способ проще?


Так же буду благодарен за любой другой совет по теме.
LepihinMS вне форума Ответить с цитированием
Старый 13.05.2009, 20:48   #6
atomicxp
Форумчанин
 
Аватар для atomicxp
 
Регистрация: 01.05.2009
Сообщений: 110
Сообщение

Цитата:
Сообщение от LepihinMS Посмотреть сообщение
Вижу только один способ получить все имена - заходить в каждый подкаталог, получать его подкаталоги и т.д. Есть ли способ проще?
Оберни метод в рекурсию, где аргументом будет директория по которой надо пройтись.
atomicxp вне форума Ответить с цитированием
Старый 27.05.2009, 18:49   #7
LepihinMS
Пользователь
 
Регистрация: 03.02.2007
Сообщений: 45
По умолчанию

Посидел-пописал
Вроде даже работает, но не могу нарисовать полосочки как в Tree от M$. Без них от программы толку мало.

Буду рад любому совету кроме "выпей йаду".

________________________
Вот я и закончил писать. Выкладываю результат, вдруг кому пригодится.

Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace TreeRekurs01
{
    class Program
    {
        static string path = "";
        static bool FileVisible = false;
        static List<string> path_folder = new List<string>();

        public static void Scan(string path, string polosa)
        {
            DirectoryInfo korenInfo = new DirectoryInfo(path);
            DirectoryInfo[] listOfDir = korenInfo.GetDirectories(); //Получаем список поддиректорий

            if (FileVisible)
            {
                FileInfo[] korenFiles = korenInfo.GetFiles();
                foreach (FileInfo fi in korenFiles)
                {
                    if (listOfDir.Length > 0)
                    {
                        if (fi != korenFiles.Last())
                        { Console.WriteLine(polosa + "│   " + fi); }
                        else
                        { Console.WriteLine(polosa + "│   " + fi + "\n" + polosa + "│   "); }
                    }
                    else
                    {
                        if (fi != korenFiles.Last())
                        { Console.WriteLine(polosa + "   " + fi); }
                        else
                        { Console.WriteLine(polosa + "   " + fi + "\n" + polosa + "   "); }
                    }
                }
            }


            foreach (DirectoryInfo dd in listOfDir) // просмотр по всем поддиректориям
            {
                if (dd.Attributes == FileAttributes.Directory) //Проверяем наличие доступа к каталогу
                {

                    // ВЫВОД ПАПОК !!!
                    if (dd == listOfDir.Last()) { Console.WriteLine(polosa + "└──" + dd); }
                    else { Console.WriteLine(polosa + "├──" + dd); }


                    //Есть ли поддиректории? НАЧАЛО
                    try //Если вдруг в папку нас не пустили...
                    {
                        DirectoryInfo dir = new DirectoryInfo(path + "\\" + dd);
                        DirectoryInfo[] listOfDirs = dir.GetDirectories();
                        if (listOfDirs.Length > 0)
                        {

                            if (dd != listOfDir.Last())
                            {
                                Scan(path + "\\" + dd, polosa + "│  ");
                            }
                            else
                            {
                                Scan(path + "\\" + dd, polosa + "   ");
                            }
                        }
                    }
                    catch { }
                    //Есть ли поддиректории? КОНЕЦ                    
                }
            }
        }


        public static void HelpMe()
        {
            Console.WriteLine(@"Графическое представление структуры папок или пути.

    TREEE [-f] путь

    -f  Вывод имен файлов в каждой папке.");
        }



        static void Main(string[] args)
        {
            bool pusk = true;
            foreach (string s in args)
            {
                if (FileVisible) { path = s; break; }
                if (s.Equals("-f"))
                {
                    FileVisible = true;
                }
                else { path = s; break; }

                if (s.Equals("-?"))
                {
                    HelpMe(); pusk = false; break;
                }
                
            }

            if (pusk)
            {
                try
                {
                    DirectoryInfo dirInfo = new DirectoryInfo(path);
                    DirectoryInfo[] listOfFIles = dirInfo.GetDirectories();
                    Console.WriteLine(dirInfo.Name);

                }
                catch
                {
                    path = "";
                    Console.WriteLine("Введен косячный путь :(");
                }


                if (path != "") Scan(path, "");
            }
        }

    }
}
____________________
Подчистил, убрал пару косячков, выделил цветом имена файлов, добавил комментарии. Однако, если снять защиту, программа аварийно завершится с ошибкой "Слишком длинный путь или имя файла. Полное имя файла должно содержать меньше 260 знаков, а имя каталога - меньше 248 знаков." + программа по неизвестной причине игнорирует некоторые папки. о_О

А так все нормально. ^_^ Скачать. (ссылка сдохла )

Последний раз редактировалось Alex11223; 22.03.2019 в 12:17.
LepihinMS вне форума Ответить с цитированием
Старый 22.03.2019, 11:13   #8
Regongar
Новичок
Джуниор
 
Регистрация: 22.03.2019
Сообщений: 1
По умолчанию

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

Код:
using System;
using System.Linq;
using System.IO;

namespace ConsoleApp2
{
    class Program
    {
        static string FLD;

        static void Main()
        {
            Console.WriteLine("Введите путь: ");
            FLD = Console.ReadLine();
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("\n" + FLD.Split(Convert.ToChar(@"\")).Last());
            Console.ResetColor();

            FUN(FLD, "");
            Console.ReadKey(true);
        }

        public static void TXCOL(string TX, ConsoleColor COL)
        {
            Console.Write(TX.Remove(TX.IndexOf(TX.Split('─').Last()), (TX.Split('─').Last()).Length));
            Console.ForegroundColor = COL;
            Console.Write(TX.Split('─').Last() + "\n");
            Console.ResetColor();
        }

        public static void FUN(string FLD, string LINE)
        {
            DirectoryInfo KOR = new DirectoryInfo(FLD); //Путь к папке
            DirectoryInfo[] LST = KOR.GetDirectories(); //Список каталогов в папке
            FileInfo[] LSTFIL = KOR.GetFiles(); //Список файлов в папке

            foreach (DirectoryInfo DI in LST)
            {
                if (DI == LST.Last() && LSTFIL.Count() == 0) TXCOL(LINE + "└──" + DI, ConsoleColor.Yellow);
                else TXCOL(LINE + "├──" + DI, ConsoleColor.Yellow);
                DirectoryInfo DIR = new DirectoryInfo(FLD + "\\" + DI);
                DirectoryInfo[] LSTDIR = DIR.GetDirectories();
                FileInfo[] LSTFILDIR = DIR.GetFiles();
                if (LSTDIR.Length > 0)
                {
                    if (DI != LSTDIR.Last()) FUN(FLD + @"\" + DI, LINE + "│  ");
                    else FUN(FLD + @"\" + DI, LINE + "   ");
                }
                else
                {
                    foreach (FileInfo FI in LSTFILDIR)
                    {
                        if (LSTFILDIR.Length > 0)
                        {
                            if (FI != LSTFILDIR.Last()) Console.WriteLine(LINE + "│  ├──" + FI);
                            else Console.WriteLine(LINE + "│  └──" + FI + "\n" + LINE + "│   ");
                        }
                    }

                }
            }

            foreach (FileInfo FI in LSTFIL)
            {
                if (FI == LSTFIL.Last()) Console.WriteLine(LINE + "└──" + FI);
                else Console.WriteLine(LINE + "├──" + FI);
            }
        }
        
    }
}
Regongar вне форума Ответить с цитированием
Старый 22.03.2019, 16:51   #9
Alex11223
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Чот сложно. И странные имена функций/переменных, используйте какой-то общепринятый стиль и не экономьте символы.

Вот более простая версия + более похожая на tree из unix.

C__Windows_system32_cmd.exe 2019-03-22 14.26.58.png

Код:
using System;
using System.IO;
using System.Linq;

namespace FsTree
{
    static class Program
    {
        static void Main(string[] args)
        {
            string startDir = args.Any() ? args[0] : ".";

            WriteColored(startDir, ConsoleColor.Blue);
            Console.WriteLine();
            
            PrintTree(startDir);
        }

        public static bool IsDirectory(this FileSystemInfo fsItem)
        {
            return (fsItem.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
        }

        public static void WriteColored(string s, ConsoleColor color)
        {
            var prevColor = Console.ForegroundColor;
            Console.ForegroundColor = color;
            Console.Write(s);
            Console.ForegroundColor = prevColor;
        }

        public static void WriteName(FileSystemInfo fsItem)
        {
            WriteColored(fsItem.Name, fsItem.IsDirectory() ? ConsoleColor.Blue : ConsoleColor.Green);
        }

        static void PrintTree(string startDir, string prefix = "")
        {
            var di = new DirectoryInfo(startDir);
            var fsItems = di.GetFileSystemInfos()
                .Where(f => !f.Name.StartsWith(".")) // hide unix "hidden" files/dirs like .git, .vs. ToDo: add -a flag for all files
                .OrderBy(f => f.Name)
                .ToList();

            for (int i = 0; i < fsItems.Count; i++)
            {
                var fsItem = fsItems[i];

                if (i == fsItems.Count - 1)
                {
                    Console.Write(prefix + "└── ");
                    WriteName(fsItem);
                    Console.WriteLine();
                    if (fsItem.IsDirectory())
                    {
                        PrintTree(fsItem.FullName, prefix + "    ");
                    }
                }
                else
                {
                    Console.Write(prefix + "├── ");
                    WriteName(fsItem);
                    Console.WriteLine();
                    if (fsItem.IsDirectory())
                    {
                        PrintTree(fsItem.FullName, prefix + "│   ");
                    }
                }
            }
        }
    }
}
https://github.com/AlexP11223/tree
Alex11223 на форуме Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Tree - иерархическое дерево каталогов. Идеи?! Dodge_wow Общие вопросы C/C++ 1 08.05.2012 13:24
Программа анализа содержимого каталогов (на ассемблере под Linux) fantom_13 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 16.03.2011 01:29
Вывод системных каталогов в ListBox whiskey Общие вопросы .NET 1 22.12.2010 10:28
Вывод иерархии каталогов на экран bat0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 25.04.2009 20:13
TASM,fat16 вывод иерархии каталогов диска bat0 Помощь студентам 2 21.04.2009 22:10