Столкнулся со следующей проблемой - необходимо вывести в дерево структуру каталогов. Была написана следующая функция, рекурсивно считывающая файлы и каталоги:
Код:
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);
}
.....
}