From $ROOTSYS/tutorials/io/fildir.C

void fildir(){
   //
   // This macro displays the ROOT Directory data structure
   //Author: Rene Brun

   TCanvas *c1 = new TCanvas("c1","ROOT FilDir description",700,900);
   c1->Range(1,1,19,24.5);
   TPaveLabel *title = new TPaveLabel(4,23,16,24.2,"ROOT File/Directory/Key description");
   title->SetFillColor(16);
   title->Draw();

   Int_t keycolor = 42;
   Int_t dircolor = 21;
   Int_t objcolor = 46;
   TPaveText *file = new TPaveText(2,19,6,22);
   file->SetFillColor(39);
   file->Draw();
   file->SetTextSize(0.04);
   file->AddText("TFile");
   file->AddText("Header");
   TArrow *arrow = new TArrow(6,20.5,17,20.5,0.02,"|>");
   arrow->SetFillStyle(1001);
   arrow->SetLineWidth(2);
   arrow->Draw();
   TPaveText *free1 = new TPaveText(8,20,11,21);
   free1->SetFillColor(18);
   free1->Draw();
   free1->AddText("First:Last");
   TPaveText *free2 = new TPaveText(12,20,15,21);
   free2->SetFillColor(18);
   free2->Draw();
   free2->AddText("First:Last");
   TText *tfree = new TText(6.2,21.2,"fFree = TList of free blocks");
   tfree->SetTextSize(0.02);
   tfree->Draw();
   TText *tkeys = new TText(5.2,18.2,"fKeys = TList of Keys");
   tkeys->SetTextSize(0.02);
   tkeys->Draw();
   TText *tmemory = new TText(3.2,15.2,"fListHead = TList of Objects in memory");
   tmemory->SetTextSize(0.02);
   tmemory->Draw();

   arrow->DrawArrow(5,17,17,17,0.02,"|>");
   TLine *line = new TLine(5,19,5,17);
   line->SetLineWidth(2);
   line->Draw();
   TPaveText *key0 = new TPaveText(7,16,10,18);
   key0->SetTextSize(0.04);
   key0->SetFillColor(keycolor);
   key0->AddText("Key 0");
   key0->Draw();
   TPaveText *key1 = new TPaveText(12,16,15,18);
   key1->SetTextSize(0.04);
   key1->SetFillColor(keycolor);
   key1->AddText("Key 1");
   key1->Draw();
   line->DrawLine(3,19,3,14);
   line->DrawLine(3,14,18,14);
   TPaveText *obj0 = new TPaveText(5,13,8,15);
   obj0->SetFillColor(objcolor);
   obj0->AddText("Object");
   obj0->Draw();
   TPaveText *dir1 = new TPaveText(10,13,13,15);
   dir1->SetFillColor(dircolor);
   dir1->AddText("SubDir");
   dir1->Draw();
   TPaveText *obj1 = new TPaveText(15,13,18,15);
   obj1->SetFillColor(objcolor);
   obj1->AddText("Object");
   obj1->Draw();
   arrow->DrawArrow(12,11,17,11,0.015,"|>");
   arrow->DrawArrow(11,9,17,9,0.015,"|>");
   line->DrawLine(12,13,12,11);
   line->DrawLine(11,13,11,9);
   TPaveText *key2 = new TPaveText(14,10.5,16,11.5);
   key2->SetFillColor(keycolor);
   key2->AddText("Key 0");
   key2->Draw();
   TPaveText *obj2 = new TPaveText(14,8.5,16,9.5);
   obj2->SetFillColor(objcolor);
   obj2->AddText("Object");
   obj2->Draw();
   TLine *ldot = new TLine(10,15,2,11);
   ldot->SetLineStyle(2);
   ldot->Draw();
   ldot->DrawLine(13,15,8,11);
   ldot->DrawLine(13,13,8,5);
   TPaveText *dirdata = new TPaveText(2,5,8,11);
   dirdata->SetTextAlign(12);
   dirdata->SetFillColor(dircolor);
   dirdata->Draw();
   dirdata->SetTextSize(0.015);
   dirdata->AddText("fModified: True if directory is modified");
   dirdata->AddText("fWritable: True if directory is writable");
   dirdata->AddText("fDatimeC: Creation Date/Time");
   dirdata->AddText("fDatimeM: Last mod Date/Time");
   dirdata->AddText("fNbytesKeys: Number of bytes of key");
   dirdata->AddText("fNbytesName : Header length up to title");
   dirdata->AddText("fSeekDir: Start of Directory on file");
   dirdata->AddText("fSeekParent: Start of Parent Directory");
   dirdata->AddText("fSeekKeys: Pointer to Keys record");
   TPaveText *keydata = new TPaveText(10,2,17,7);
   keydata->SetTextAlign(12);
   keydata->SetFillColor(keycolor);
   keydata->Draw();
   ldot->DrawLine(14,11.5,10,7);
   ldot->DrawLine(16,11.5,17,7);
   keydata->SetTextSize(0.015);
   keydata->AddText("fNbytes: Size of compressed Object");
   keydata->AddText("fObjLen: Size of uncompressed Object");
   keydata->AddText("fDatime: Date/Time when written to store");
   keydata->AddText("fKeylen: Number of bytes for the key");
   keydata->AddText("fCycle : Cycle number");
   keydata->AddText("fSeekKey: Pointer to Object on file");
   keydata->AddText("fSeekPdir: Pointer to directory on file");
   keydata->AddText("fClassName: 'TKey'");
   keydata->AddText("fName: Object name");
   keydata->AddText("fTitle: Object Title");
}
 fildir.C:1
 fildir.C:2
 fildir.C:3
 fildir.C:4
 fildir.C:5
 fildir.C:6
 fildir.C:7
 fildir.C:8
 fildir.C:9
 fildir.C:10
 fildir.C:11
 fildir.C:12
 fildir.C:13
 fildir.C:14
 fildir.C:15
 fildir.C:16
 fildir.C:17
 fildir.C:18
 fildir.C:19
 fildir.C:20
 fildir.C:21
 fildir.C:22
 fildir.C:23
 fildir.C:24
 fildir.C:25
 fildir.C:26
 fildir.C:27
 fildir.C:28
 fildir.C:29
 fildir.C:30
 fildir.C:31
 fildir.C:32
 fildir.C:33
 fildir.C:34
 fildir.C:35
 fildir.C:36
 fildir.C:37
 fildir.C:38
 fildir.C:39
 fildir.C:40
 fildir.C:41
 fildir.C:42
 fildir.C:43
 fildir.C:44
 fildir.C:45
 fildir.C:46
 fildir.C:47
 fildir.C:48
 fildir.C:49
 fildir.C:50
 fildir.C:51
 fildir.C:52
 fildir.C:53
 fildir.C:54
 fildir.C:55
 fildir.C:56
 fildir.C:57
 fildir.C:58
 fildir.C:59
 fildir.C:60
 fildir.C:61
 fildir.C:62
 fildir.C:63
 fildir.C:64
 fildir.C:65
 fildir.C:66
 fildir.C:67
 fildir.C:68
 fildir.C:69
 fildir.C:70
 fildir.C:71
 fildir.C:72
 fildir.C:73
 fildir.C:74
 fildir.C:75
 fildir.C:76
 fildir.C:77
 fildir.C:78
 fildir.C:79
 fildir.C:80
 fildir.C:81
 fildir.C:82
 fildir.C:83
 fildir.C:84
 fildir.C:85
 fildir.C:86
 fildir.C:87
 fildir.C:88
 fildir.C:89
 fildir.C:90
 fildir.C:91
 fildir.C:92
 fildir.C:93
 fildir.C:94
 fildir.C:95
 fildir.C:96
 fildir.C:97
 fildir.C:98
 fildir.C:99
 fildir.C:100
 fildir.C:101
 fildir.C:102
 fildir.C:103
 fildir.C:104
 fildir.C:105
 fildir.C:106
 fildir.C:107
 fildir.C:108
 fildir.C:109
 fildir.C:110
 fildir.C:111
 fildir.C:112
 fildir.C:113
 fildir.C:114
 fildir.C:115
 fildir.C:116
 fildir.C:117
 fildir.C:118
 fildir.C:119
 fildir.C:120