// @(#)root/table:$Id$ // 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 #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) //////////////////////////////////////////////////////////////////////////////// ///to be documented TFileSet::TFileSet() : 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 TFileSet::TFileSet(const TString &dirname,const Char_t *setname,Bool_t expand, Int_t maxDepth) : TDataSet() { 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"); } } //////////////////////////////////////////////////////////////////////////////// ///to be documented TFileSet::~TFileSet() { } //////////////////////////////////////////////////////////////////////////////// ///to be documented Bool_t TFileSet::IsEmpty() const { return strcmp(GetTitle(),"file")!=0 ? kTRUE : kFALSE ; } //////////////////////////////////////////////////////////////////////////////// /// 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() /// Long_t TFileSet::HasData() const { 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) } //////////////////////////////////////////////////////////////////////////////// /// If the title of this TFileSet is "file" it is NOT folder /// see: TFileSet(TString &dirname,const Char_t *setname,Bool_t expand) /// Bool_t TFileSet::IsFolder() const { return strcmp(GetTitle(),"file")!=0; }