Работа с деревом каталогов – “перевод” кода с C# на С++

Опубликовано Oct 9, 2012 в Деревья и графы | 1 коммент.

, , , ,

Работа с деревом каталогов – “перевод” кода с C# на С++

В категории “Деревья и графы” до сих пор были задачки в основном с алгоритмическим акцентом. Добавим задачу практическую: ее суть – обход дерева файловых каталогов и вывод некоторой информации о файлах по мере обхода. Предполагается, что имеется решение на C#, а по какой-то причине необходимо повторить эту же функциональность на C++.  Так задачи тоже иногда могут ставиться.

Код решения задачи обхода дерева каталогов на C#

using System;
using System.IO;
 
namespace ConsoleApplication
{
  class Tester
  {
    static int dirCounter = 1;
    static int indentLevel = -1;
    static int fileCounter = 0;
    static string TextToWrite = "";
    static string theDirectory = "";
    static StreamWriter writer;
 
    public static void Main()
    {
      Tester tester = new Tester();
 
      using (writer = new StreamWriter(@"output.txt"))
      {
 
        //Иммитация ввода имени стартового директория
        theDirectory = ********;
 
        DirectoryInfo dir = new DirectoryInfo(theDirectory);
        writer.WriteLine(theDirectory); //Записали в файл имя папки
        tester.ExploreDirectory(dir);
 
        //Запустили исследование и вывели на экран результат
        TextToWrite = String.Format
          ("{0} files in {1} directories found.",
           fileCounter, dirCounter);
 
        writer.WriteLine(TextToWrite);
      }
 
      Console.WriteLine("Закончили - нажмите клавишу...");
      Console.Read();
    }
 
    private void ExploreDirectory(DirectoryInfo dir)
    {
      indentLevel++;  //Увеличили отступ
      TextToWrite = ""; //Создали отступ
 
      for (int i = 0; i < indentLevel - 1; i++)
        TextToWrite += "  ";
 
      //Вывод/запись информации о папке
      TextToWrite += String.Format("[{0}] {1} [{2}]",
        indentLevel, dir.Name, dir.LastAccessTime);
 
      writer.WriteLine(TextToWrite);
 
      //Получили коллекцию файлов в папке
      FileInfo[] filesInDir = dir.GetFiles();
      foreach (FileInfo file in filesInDir)
      {
        TextToWrite = "";
 
        //Уровень отступа + 1
        for (int i = 0; i < indentLevel + 1; i++)
          TextToWrite += "  ";
 
        //Вывод/запись информации о файле
        TextToWrite += String.Format
          ("{0} [{1}] Size: {2} bytes", file.Name,
               file.LastWriteTime, file.Length);
 
        fileCounter++;	//Кол-во файлов + 1
 
        writer.WriteLine(TextToWrite);
      }
 
      //Получили все подкаталоги и для каждого запустили исследование
      DirectoryInfo[] directories = dir.GetDirectories();
      foreach (DirectoryInfo newDir in directories)
      {
        dirCounter++;  //Кол-во папок + 1
        ExploreDirectory(newDir);
      }
      indentLevel--; //Вышли из папки -> отступ -1
    }
  }
}

Автор публикации: