Доброго времени суток, эксперты. Есть такая проблема: удаление непустого каталога(файлы/вложенные каталоги). Вроде понятно что нужна рекурсия. Только вот загвоздка в чём - компилятор Turboc30(никакого визуала, только консоль), в хелпе нашёл findferst, так вот, какой ей параметр передать, чтобы она находила не только каталоги, но файлы(скрытые, только чтение, и т.д.).В Delphi есть такой параметр как AniFile, а вот в С? А может у вас есть другое решение, более простое? эыж ос-win98.
Добрый день, Michael! Ispol'zuy funkcii FindFirstFile i FindNextFile. V etix funkciax kak parametry ispol'zuyutsya HANDLE i WIN32_FIND_DATA. Iz posledney strukturi naxodish' imya, razmer i drugie parametry tekushego naydennogo faila. Tol'ko postaraysya ne pol'zovat'sya class-om CFileFind iz MFC. Nestabil'no rabotayet. Udachi. Ответ отправлен: 29.05.2003, 14:10 Отправитель: Hayk Отвечает Ramzes
Доброе время суток, Michael! Первым параметром передаешь "*.*", и потом сравниваешь поле attrib структуры _finddata_t со следующими флагами посредством побитового AND #define _A_NORMAL 0x00 /* Normal file - No read/write restrictions */ #define _A_RDONLY 0x01 /* Read only file */ #define _A_HIDDEN 0x02 /* Hidden file */ #define _A_SYSTEM 0x04 /* System file */ #define _A_SUBDIR 0x10 /* Subdirectory */ #define _A_ARCH 0x20 /* Archive file */ Ответ отправлен: 30.05.2003, 13:32 Отправитель: Ramzes Отвечает BOLT
Приветствую Вас, Michael! int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); 1-й параметр путь поиска 2-й параметр это структура: struct ffblk { long ff_reserved; long ff_fsize; /* размер файла */ unsigned long ff_attrib; /* атрибуты найденого */ unsigned short ff_ftime; /* время модификации */ unsigned short ff_fdate; /* дата модификации */ char ff_name[256]; /* имя найденого файла*/ };
3-й параметр это атрибуты файлов для поиска: FA_RDONLY Только для чткния FA_HIDDEN Скрытый файл FA_SYSTEM Системный файл FA_LABEL метка диска FA_DIREC дирректория FA_ARCH архивный
И наконец пример: /* применение функций поиска файлов findfirst и findnext на примере поиска скрытных файлов*/ #include
#include int main(void) { struct ffblk ffblk; int done; printf("Обзор всех скрытных файлов домашней дирректории
"); done = findfirst("*.*",&ffblk,FA_HIDDEN); while (!done) { printf(" %s
", ffblk.ff_name); done = findnext(&ffblk); } return 0; }
Счастливо!
Ответ отправлен: 29.05.2003, 17:32 Отправитель: BOLT Отвечает [MozgC]
// Ищем все файлы со всеми аттрибутами и каталоги внутри // текущего каталога // Добавь тут проверку на найденный каталог и сделай // рекурсию. Все... #include #include int main(void) { struct find_t ffblk; int done; done = _dos_findfirst("*.*",19,&ffblk); while (!done) { printf(" %s
", ffblk.name); done = _dos_findnext(&ffblk); } fclose(F); return 0; } Ответ отправлен: 28.05.2003, 00:25 Отправитель: [MozgC] Отвечает Avl2k
Добрый день, Michael! Не знаю как в TC3.0, а в BC++ 3.1 для поиска директорий функции finfirst int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); надо указывать в атрибуте (последний параметр) флажок FA_DIREC. С уважением, Avl2k. Ответ отправлен: 28.05.2003, 16:10 Отправитель: Avl2k
Вопрос № 807
Здравствуйте. Мне надо написать FAQ. С возможностью задавания вопросов. Но при получении данных методом POST почему-то не передаются(или я не так читаю) спецсимволы. Точнее, передаются, но '"' передаётся как '"', '<' - как '<' и т.д. а не %XX Что я не правильно делаю? В приложении - моя процедура считывания и структура данных(для понятности)
Добрый день, Victor! Чего мучаешься? символ % - код 0x25 символ < - код 0x3C if (char == 0x25) //если символ равен '%' и т.д. Счастливо! Ответ отправлен: 28.05.2003, 17:18 Отправитель: BOLT
Вопрос № 808
В упражнении книги Д. Рассохина "От Си к Си++" есть такой пример использования преобразования типов: void swap4(double &x, double &y) {…} … int a=0, b=1 … swap4(a, b); При компиляции на Visual C++ 6.00 пишеться: swap4' : cannot convert parameter 1 from 'int' to 'double &' Рассохин же говорит о том, что в данном случае: "компилятор создает временную переменную требуемого типа, присваивает ей значение передаваемого параметра (конечно, после преобразования типа, если таковое возможно!), и функции передается адрес этой временной переменной." Может, дело в том, что Рассохин использовал компилятор Borland C++ 3.0? Или дело в чем-то другом? Как же сделать так, чтобы происходило преобразование типов? На всякий случай, посылаю текст всего упражнения.
Здравствуйте, Alexander! извиняюсь за грубость, но по-видимому Рассохин мудак. Ссылка на то она и ссылка, что должна указывать на настоящий объект. В случае с const double & d, компилятор может и создать временный объект, но без const - не должен. Ответ отправлен: 29.05.2003, 09:47 Отправитель: vitya Отвечает Ramzes
Здравствуйте, Alexander! Книжка наверное старая. Потому что компилятор VC 6.0 действительно не разрешает подобного преобразования типов. Разрешается так void print(const double& a, const double& b); int a = 5, b = 7; print(a, b); Ответ отправлен: 30.05.2003, 13:24 Отправитель: Ramzes Отвечает [MozgC]
В компиляторе Borland C++ 3.0 действительно вес работает Ответ отправлен: 28.05.2003, 12:01 Отправитель: [MozgC] Отвечает Avl2k
Здравствуйте, Alexander! Если параметр функции ссылка, то передать параметром временную переменную можно только в том случае, если ссылка будет константной. Иначе поведение будет странным: допустим, компилятор создаст временные double-переменные для int'ов; затем в функции swap4 значения этих переменных обменяются, но при этом значения исходных int'ов не изменятся - это явно не то, что Вы ожидаете. А компилятор BC++ 3.0, видимо, ещё не подозревал об этом. Хотя я пробовал компилировать этот пример BC++ 3.1, и он выдал предупреждение. С уважением, Avl2k. Ответ отправлен: 28.05.2003, 12:25 Отправитель: Avl2k Отвечает BOLT
Здравствуйте, Alexander! Не знаю, что там говорит Д. Рассохин, но если даже подумать логически: как ссылка одного типа переменной может ссылаться на другой тип переменной.Автоматическре преобразование в C++, если я не ошибаюсь, применимо только для фактичеких переменных, а не для их ссылок. Попробуй передовать параметры как фактические перменные. Это мое мнение - я могу ошибаться. Счастливо! Ответ отправлен: 28.05.2003, 17:28 Отправитель: BOLT
Вопрос № 809
Пожалуйста помогите разобраться с экранным меню Buildera, а то всё на английском и я ничего не понимаю.Например, команды Project, View и всех других команд.Буду очень благодарен!
Тебе лучше купить книжку по Buileder'у или скачай в инете книгу в электронном варианте, поищи в поисковиках Ответ отправлен: 28.05.2003, 11:58 Отправитель: [MozgC] Отвечает BOLT
Доброе время суток, Игорь! Мой тебе совет, Игорь, установи себе электронный переводчик, например "ABBY Lingvo".А то завтра может попросишь перевести и MSDN :з). Ты не обижайся, просто все мы так делаем. Счастливо! Ответ отправлен: 28.05.2003, 17:38 Отправитель: BOLT
Вопрос № 811
Здравствуйте. В приложении функция video_mode() из древней книги от Шлидта. Функция используется для определения текстового режима экрана. Пожалуйста растолкуйте мне зачем здесь запись "& 255", что она делает и что будет если это туда не написать. З.Ы. Большое спасибо.
Здравствуйте, CrazyIronToilet! точно сказать не могу, но скорее всего функция int86 возвращает слово (2 байта), один старший байт наверное возвращает статус или что-нибудь из этой серии, а нас интересует лишь младший байт, который получается с помощью & 255. Да - и он Шилдт. :) :) Ответ отправлен: 29.05.2003, 09:39 Отправитель: vitya Отвечает Hayk
Доброе время суток, CrazyIronToilet! Dumayu int86 vosvrashyayet znacheniye tipa short, int, long, i v poslednem baite vozvrashayet'ysa tekstovi rejim. V starshix baitax naxodit'say kakaya-to informaciya, kotoraya ni imeet v dannom sluchaye znacheniya, pobitovoi operaciei obnulyayem starshie baity vozvrashennogo znacheniye. int : 0xA3015F08 & 0x000000FF(255) = 0x08 ( eto i est' identifikator rejima ) & eto operator bobitovogo i. bitwise AND. Kotory obnulyayet starshie baity. Ответ отправлен: 29.05.2003, 14:30 Отправитель: Hayk Отвечает Ramzes
Здравствуйте, CrazyIronToilet! По моему если убрать &255 то ничего не изменится, т.к. при побитовом AND любого числа с единицами (255 = 11111111 ) число не изменится. Ответ отправлен: 30.05.2003, 13:10 Отправитель: Ramzes Отвечает [MozgC]
Ничего не должно измениться. это побитовый оператор AND Значение возвращаемое функцией int86 подвергнется операции И, и video_mode будет возвращать значение равное x and 255, где X - значение возвращаемое int86, Однако 255 = FF = 1111111, поэтому ничего не изменит, можно убрать &255 и ничего не изменится.. таблица AND: 0 and 0 = 0 0 and 1 = 0 1 and 0 = 0 1 and 1 = 1
Ответ отправлен: 28.05.2003, 21:21 Отправитель: [MozgC] Отвечает BOLT
Приветствую Вас, Сумашедший Железный Туалет! & в C оператор битового сравнения, анологичен в асме AND. 255 в двоичной системе исчесления равно 11111111.Ну так вот, если у обоих операндов биты 1 и 1, значит значение выражения тоже 1, в других случаях 0. Пример: 01011010 - исходное число AND 11111111 - это 255 в dec-исчеслении = 01011010 - это результат Короче: аставь как есть и учи асм! Счастливо! Ответ отправлен: 28.05.2003, 22:16 Отправитель: BOLT
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.