dirtree

Quoc氏が作ってくれたもの。

    class Program
    {
        static void Main(string[] args)
        {
            //Title - タイトル
            Console.Write("*****Hello dirtree*****\n");
            
            //Get the current directory of application
            string scurdir=Directory.GetCurrentDirectory();

            //Get the subdirectory list of selected directory 
            string[] arrsubdir = Directory.GetDirectories(scurdir);
            
            //Output the results
            PrintValues(arrsubdir);
        }

        public static void PrintValues(Object[] myArr)
        {
            foreach (Object i in myArr)
            {
                //Print the values
                Console.Write("-> {0}\n", i);

                //recursive
                //Get the subdirectory list of selected directory 
                string[] arrsubdir = Directory.GetDirectories(i.ToString());

                //Output the results
                PrintValues(arrsubdir);
            }
        }
    }

ちょっとガッカリ。
ということでこれをアレンジしてWindowsのTreeコマンドっぽくしてくれないか?といってみた。

dirtree改訂版

    class Program
    {
        private static IDirectorySep m_sep = new ExtensionDirectorySep();
        static void Main(string[] args)
        {
            foreach (string cmdLine in System.Environment.GetCommandLineArgs())
            {
                string up = cmdLine.ToUpper();
                if (up == "/A")
                {
                    m_sep = new AsciiDirectorySep();
                }
                else if (up == "/?")
                {
                    // stub
                    Console.WriteLine("no implements option:{0}",up);
                }
                else if (up == "/F")
                {
                    // stub
                    Console.WriteLine("no implements option:{0}",up);
                }
                else
                {
                    Console.WriteLine("no implements option:{0}",up);
                }
            }
            //Title - タイトル
            Console.Write("*****Hello dirtree*****\n");
            
            //Get the current directory of application
            string scurdir=Directory.GetCurrentDirectory();

            //Get the subdirectory list of selected directory 
            string[] arrsubdir = Directory.GetDirectories(scurdir);
            
            //Output the results
            Console.WriteLine(scurdir);
            PrintValues(arrsubdir, "");
        }

        public static void PrintValues(Object[] myArr, string sepStr)
        {
            if (myArr == null)
                return;
            for (int i=0; i<myArr.Length; i++)
            {
                //recursive
                //Get the subdirectory list of selected directory 
                string[] arrsubdir = Directory.GetDirectories(myArr[i].ToString());
                if (i == myArr.Length - 1)
                {
                    Console.WriteLine(
                        "{0}{1}{2}",
                        sepStr,
                        m_sep.endShowStr,
                        new DirectoryInfo(myArr[i].ToString()).Name
                    );
                    PrintValues(arrsubdir, sepStr + m_sep.endSepStr);
                }
                else
                {
                    Console.WriteLine(
                        "{0}{1}{2}",
                        sepStr,
                        m_sep.nextShowStr,
                        new DirectoryInfo(myArr[i].ToString()).Name
                    );
                    PrintValues(arrsubdir, sepStr + m_sep.nextSepStr);
                }
            }
        }
    }
    interface IDirectorySep
    {
        string endShowStr
        {
            get;
        }
        string nextShowStr
        {
            get;
        }
        string endSepStr
        {
            get;
        }
        string nextSepStr
        {
            get;
        }
    }
    sealed class ExtensionDirectorySep : IDirectorySep
    {
        #region IDirectorySep メンバ
        public string endShowStr
        {
            get { return "└─"; }
        }

        public string nextShowStr
        {
            get { return "├─"; }
        }

        public string endSepStr
        {
            get { return "  "; }
        }

        public string nextSepStr
        {
            get { return "| "; }
        }

        #endregion
    }
    class AsciiDirectorySep : IDirectorySep
    {
        #region IDirectorySep メンバ

        public string endShowStr
        {
            get { return "\\--"; }
        }

        public string nextShowStr
        {
            get { return "+--"; }
        }

        public string endSepStr
        {
            get { return "   "; }
        }

        public string nextSepStr
        {
            get { return "|  "; }
        }

        #endregion
    }

前日に見てしまったMr.R氏ソースコードの印象が強く、もろパク気味になってしまった。テストに時間がかかったので私が30分くらいで作った。30分もかかった自分にがっくし。
Quoc氏は出来なかった。少し不安になってくるが、まあこんなもんかな、という感じ。