Показать сообщение отдельно
Старый 01.12.2004, 13:41     # 1
kot_
Junior Member
 
Аватар для kot_
 
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67

kot_ Путь к славе только начался
Как вывести структуру директорий на компакт-диске. Возможно вопрос для ФАК'а

Столкнулся со следующей проблемой - необходимо вывести в дерево структуру каталогов. Была написана следующая функция, рекурсивно считывающая файлы и каталоги:
Код:
void __fastcall TForm1::FoundFile(AnsiString Dir,TTreeNode *Node)
{
TSearchRec sr;
TTreeNode *NewNode;
TTreeNode *PNode;
ChDir(Dir);
PNode = tvList->Items->AddChild(Node,Dir);
PNode->ImageIndex =0;
FindFirst("*.*",faAnyFile,sr);

while(FindNext(sr)==0){
  if(sr.Name !="."&&sr.Name!=".."){
  if(sr.Attr ==faDirectory){
   FoundFile(sr.Name,PNode);
  }
  else{
   if(sr.Attr!=faDirectory){
     NewNode = tvList->Items->AddChild(PNode,sr.Name);
     NewNode->ImageIndex = 2;
   }
  }
//
 }
}
 FindClose(sr);
 ChDir("..");
}
собственно задача элементарная - считать содержимое некоторого каталога в дерево. Читает без проблем. НО! Только на жестком диске... После записи на болванку - прога категорически перестала выводить список - выводит одну директорию и считает ее файлом.
Проблема оказалась в следующем - атрибуты директории на компакте имеют значение не 0х010(константа faDirectory) а 0х011 - добавляется лишний бит.
То есть, если вы предполагаете использовать подобный механизм для получения списка директорий на ВСЕХ дисках должно быть вот так:
Код:
void __fastcall TForm1::FoundFile(AnsiString Dir,TTreeNode *Node)
{
....
  if(sr.Attr ==0х010||sr.Attr ==0х011){
   FoundFile(sr.Name,PNode);
  }
 .....
}
Тогда работает.
Точнее правильно так:
Код:
void __fastcall TForm1::FoundFile(AnsiString Dir,TTreeNode *Node)
{
....
  if(sr.Attr&faDirectory){
   FoundFile(sr.Name,PNode);
  }
 .....
}
__________________

Последний раз редактировалось kot_; 01.12.2004 в 16:25.
kot_ вне форума