Титульная страница Иерархия классов Алфавитный указатель Классы Файлы Члены классов Члены файла Примеры

# DirTree.cpp

Пример использования классов Server, Volume, Volumes, Directory, Directories, Path, Exception. Данный пример демонстрирует простейшую программу, которая выводит на консоль дерево подкаталогов сервера, тома либо каталога.

    #include <stdio.h>
    #include <memory.h>
    #include "BGDNet.h"

    using BGDNet::Server;
    using BGDNet::Volume;
    using BGDNet::Volumes;
    using BGDNet::Directory;
    using BGDNet::Directories;
    using BGDNet::Path;
    using BGDNet::Exception;

    void srvTree( const Server* pSrv );
    void volTree( const Volume* pVol );
    void dirTree( const Directory* pDir, int level = 0 );

    int main( int argc, char* argv[] )
    {
      if (argc < 2)
      {
        puts("Usage: DirTree.exe <server_name> [<volume_name> [<dir_path>]]");
        return -1;
      }

      try
      {
        Server srv(argv[1]);
        if (2 == argc)
          srvTree(&srv); // Выводим содержимое всего сервера
        else
        {
          Volume vol(&srv, argv[2]);
          if (3 == argc)
            volTree(&vol); // Выводим содержимое тома на сервере
          else
          {
            // Выводим содержимое каталога
            Directory dir(&vol, Path(argv[3], NW_NS_LONG));
            dirTree(&dir);
          }
        }
      }
      catch (const Exception& e)
      {
        printf("ERROR: %s\n", e.what());
      }
      puts("----------");

      return 0;
    }

    void srvTree( const Server* pSrv )
    {
      printf("Server %s:\n", (const char*)pSrv->name());
      puts("---------------");
      Volumes vlms;
      pSrv->getVolumes(&vlms);
      for (int i = 0; i < vlms.size(); ++i)
        volTree(vlms[i]);
    }

    void volTree( const Volume* pVol )
    {
      printf(" Volume %s:\n", (const char*)pVol->name());
      puts(" ---------------");
      dirTree(pVol->root(), 2);
    }

    void dirTree( const Directory* pDir, int level )
    {
      const int MAX_LEVEL = 50;
      if (level < MAX_LEVEL)
      {
        char buf[MAX_LEVEL + 1];
        memset(buf, ' ', level);
        buf[level] = '\0';
        Directories dirs;
        pDir->getSubdirs(&dirs);
        for (int i = 0; i < dirs.size(); ++i)
        {
          const Directory* pSubDir = dirs[i];
          printf("%s%s\n", buf, (const char*)pSubDir->name());
          dirTree(pSubDir, level + 1);
        }
      }
    }