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);
}
.....
}
{
....
if(sr.Attr ==0х010||sr.Attr ==0х011){
FoundFile(sr.Name,PNode);
}
.....
}
Тогда работает.
Чтобы узнать, директория или нет, нужно комбинировать Attr с битовой маской faDirectory ( 0х010 ) с помощью операции "И": if( sr.Attr & faDirectory == faDirectory ) .
Естественно, что на компакт-диске к атрибутам файла добавляется ещё единица в младший разряд - это же признак faReadOnly
В хелпе ясно написано :D
Цитата:
Originally posted by fellow
Заработался, бедняга:D
Чтобы узнать, директория или нет, нужно комбинировать Attr с битовой маской faDirectory ( 0х010 ) с помощью операции "И": if( sr.Attr & faDirectory == faDirectory ) .
Естественно, что на компакт-диске к атрибутам файла добавляется ещё единица в младший разряд - это же признак faReadOnly
В хелпе ясно написано :D
Заработался, бедняга:D
Чтобы узнать, директория или нет, нужно комбинировать Attr с битовой маской faDirectory ( 0х010 ) с помощью операции "И": if( sr.Attr & faDirectory == faDirectory ) .
Естественно, что на компакт-диске к атрибутам файла добавляется ещё единица в младший разряд - это же признак faReadOnly
В хелпе ясно написано :D
Да точно заработался.:)
Код:
if( sr.Attr & faDirectory)
Вполне достаточно.