Консультация № 49495
18.07.2006, 18:59
0.00 руб.
0 2 2
Добрый день тов. эксперты. Я пишу программу, которая должна выводить список файлов и папок в определенной директории. Выводить файлы я ее научил. Как научить ее выводить папки.

Приложение:
#include <stdio.h>#include <dir.h>#include <dos.h>main(){struct ffblk ffblk; int done; done=findfirst("*.*",&ffblk,0); while(!done) {printf("%s\n",&ffblk.ff_name); done=findnext(&ffblk); }}

Обсуждение

Неизвестный
18.07.2006, 19:47
общий
это ответ
Здравствуйте, psevdo!

Если честно, давно не работал с библиотекой dir.h.
Но в io.h (от Microsoft) есть аналогичные функции _findfirst, _findnext и _findclose. Так вот они (т.е. первые две) возвращают как файлы, так и папки в перемешку, а различать их приходится по установленному биту _A_RDONLY в поле attrib структуры _finddata_t, хранящей также имя файла и время его создания и модификации.
Наверняка и у Вас должно быть что-то аналогичное, так что внимательней смотрите поля у ffblk и, возможно, попробуйте указать в качестве фильтра просто "*".
Неизвестный
19.07.2006, 12:21
общий
это ответ
Здравствуйте, psevdo!

Каталоги, файлы, метки томов и пр. объекты файловой системы различается по атрибутам:
Для DOS - "FA_*"
Для того, чтобы найти файлы, включая каталоги, необходимо в findfirst() последним параметром задать атрибуты поиска. Ловите код, который ищет файлы, а также каталоги и метки тома, помечая каталоги знаком "", а метки - знаком "\" перед выводом имени (см. приложение). Там же, в этом же коде я привёл (в комментариях) список остальных возможных атрибутов поиска.
В случае, когда нужно найти ВСЁ, необязательно утруждать себя перечислением _всех_ констант, достаточно ввести значение 0xFFFF...:)

Приложение:
#include <stdio.h>#include <conio.h>#include <dir.h>#include <dos.h>/*File attributes: Constant │ Description═══════════╪═════════════════════ FA_RDONLY │ Read-only attribute FA_HIDDEN │ Hidden file FA_SYSTEM │ System file FA_LABEL │ Volume label FA_DIREC │ Directory FA_ARCH │ Archive*/void main(void){struct ffblk ffblk; clrscr(); int done; done=findfirst("*.*", &ffblk, FA_DIREC + FA_LABEL); while(!done) { if (ffblk.ff_attrib == FA_DIREC) printf("\"); if (ffblk.ff_attrib == FA_LABEL) printf("\\\"); printf("%s\n",&ffblk.ff_name); done=findnext(&ffblk); }}
Форма ответа