// @(#)root/table:$Name:  $:$Id: TFileSet.cxx,v 1.7 2006/12/13 21:28:14 brun Exp $
// Author: Valery Fine(fine@mail.cern.ch)   03/07/98

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

#include "TFileSet.h"
#include "TBrowser.h"
#include "TSystem.h"

#ifndef WIN32
#include <errno.h>
#endif

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFileSet                                                             //
//                                                                      //
// TFileSet class is a class to convert the                             //
//      "native file system structure"                                  //
// into an instance of the TDataSet class                               //
//                                                                      //
//  Example:                                                            //
//    How to convert your home directory into the OO dataset            //
//                                                                      //
//  root [0] TString home = "$HOME";                                    //
//  root [1] TFileSet set(home);                                        //
//  root [2] TBrowser b("MyHome",&set);                                 //
//  root [3] set.ls("*");                                               //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

ClassImp(TFileSet)

//______________________________________________________________________________
TFileSet::TFileSet()
         : TDataSet()
{
   //to be documented
}

//______________________________________________________________________________
TFileSet::TFileSet(const TString &dirname,const Char_t *setname,Bool_t expand, Int_t maxDepth)
           : TDataSet()
{
  //
  // Creates TFileSet
  // Convert the "opearting system" file system tree into the memory resided TFileSet
  //
  //  Parameters:
  //  -----------
  //  dirname  - the name of the "native file system" directory
  //             to convert into TFileSet
  //  setname  - the name of this TFileSet (it is the "base name"
  //                                 of the "dirname" by default)
  //  expand   - flag whether the "dirname" must be "expanded
  //             (kTRUE by default)
  //  maxDeep  - the max number of the levels of the directory to read in
  //             (=10 by default)
  //  Note: If the "dirname" points to non-existent object, for examoe it is dead-link
  //  ----  the object is marked as "Zombie" and this flag is propagated upwards

   if (!maxDepth) return;

   Long64_t size;
   Long_t id, flags, modtime;
   TString dirbuf = dirname;

   if (expand) gSystem->ExpandPathName(dirbuf);
   const char *name= dirbuf;
   if (gSystem->GetPathInfo(name, &id, &size, &flags, &modtime)==0) {

      if (!setname) {
         setname = strrchr(name,'/');
         if (setname) setname++;
      }
      if (setname) SetName(setname);
      else SetName(name);

      // Check if "dirname" is a directory.
      void *dir = 0;
      if (flags & 2 ) {
         dir = gSystem->OpenDirectory(name);
         if (!dir) {
#ifndef WIN32
            perror("can not be open due error\n");
            Error("TFileSet", "directory: %s",name);
#endif
         }
      }
      if (dir) {   // this is a directory
         SetTitle("directory");
         while ( (name = gSystem->GetDirEntry(dir)) ) {
            // skip some "special" names
            if (!name[0] || strcmp(name,"..")==0 || strcmp(name,".")==0) continue;
            Char_t *file = gSystem->ConcatFileName(dirbuf,name);
            TString nextdir = file;
            delete [] file;
            TFileSet *fs = new TFileSet(nextdir,name,kFALSE,maxDepth-1);
            if (fs->IsZombie())  {
               // propagate "Zombie flag upwards
               MakeZombie();
            }
            Add(fs);
         }
         gSystem->FreeDirectory(dir);
      } else
         SetTitle("file");
   } else {
      // Set Zombie flag
      MakeZombie();
      SetTitle("Zombie");
   }
}

//______________________________________________________________________________
TFileSet::~TFileSet()
{
   //to be documented
}

//______________________________________________________________________________
Bool_t TFileSet::IsEmpty() const
{
   //to be documented
   return  strcmp(GetTitle(),"file")!=0 ? kTRUE : kFALSE ;
}

//______________________________________________________________________________
Long_t TFileSet::HasData() const
{
   // This implementation is done in the TDataSet::Purge() method in mind
   // Since this method returns non-zero for files the last are NOT "purged"
   // by TDataSet::Purge()
   //
   return strcmp(GetTitle(),"file")==0 ? 1 : 0;

   //  this must be like this:
   //  return !IsFolder() ;
   //  Alas TObject::IsFolder() isn't defined as "const" (IT IS in 2.25/03)
}

//______________________________________________________________________________
Bool_t TFileSet::IsFolder() const
{
   // If the title of this TFileSet is "file" it is NOT folder
   // see: TFileSet(TString &dirname,const Char_t *setname,Bool_t expand)
   //
   return strcmp(GetTitle(),"file")!=0;
}


ROOT page - Class index - Class Hierarchy - Top of the page

This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.