Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как вывести структуру директорий на компакт-диске.

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

Тогда работает.
310
01 декабря 2004 года
fellow
853 / / 17.03.2003
Заработался, бедняга:D

Чтобы узнать, директория или нет, нужно комбинировать Attr с битовой маской faDirectory ( 0х010 ) с помощью операции "И": if( sr.Attr & faDirectory == faDirectory ) .

Естественно, что на компакт-диске к атрибутам файла добавляется ещё единица в младший разряд - это же признак faReadOnly

В хелпе ясно написано :D
1
01 декабря 2004 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by fellow
Заработался, бедняга:D

Чтобы узнать, директория или нет, нужно комбинировать Attr с битовой маской faDirectory ( 0х010 ) с помощью операции "И": if( sr.Attr & faDirectory == faDirectory ) .

Естественно, что на компакт-диске к атрибутам файла добавляется ещё единица в младший разряд - это же признак faReadOnly

В хелпе ясно написано :D


Да точно заработался.:)

 
Код:
if( sr.Attr & faDirectory)

Вполне достаточно.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог