| imho.ws |
![]() |
|
|
|||||||
|
Сообщения:
Перейти к новому /
Последнее
|
Опции темы |
|
|
# 1 |
|
Junior Member
Регистрация: 19.11.2004
Адрес: Dnepropetrovsk
Пол: Male
Сообщения: 67
![]() |
Как вывести структуру директорий на компакт-диске. Возможно вопрос для ФАК'а
Столкнулся со следующей проблемой - необходимо вывести в дерево структуру каталогов. Была написана следующая функция, рекурсивно считывающая файлы и каталоги:
Код:
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. |
|
|
|
|
# 2 |
|
Full Member
Регистрация: 19.12.2003
Адрес: Москва
Пол: Male
Сообщения: 514
![]() ![]() ![]() |
Это не только для компакта так будет. Сделай на жёстком диске системный, или скрытый, или read-only каталог и попробуй с ним первый вариант - он точно так же скажет, что это файл
Дело в том, что каждый атрибут - это отдельный бит в слове атрибутов, и каталог - только один из них. Так что даже примерКод:
if(sr.Attr ==0х010||sr.Attr ==0х011){
Код:
if (sr.Attr & faDirectory) {
|
|
|