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

Ваш аккаунт

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

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

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

Как определить является файл каталогом или нет?

2.0K
25 февраля 2003 года
victor
9 / / 22.11.2002
Проблема в том, что при использовании, скажем конструкции:
if(GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY)
{
...
}
каталоги с флагами Read-Only не попадают в блок обработки.
380
25 февраля 2003 года
Arestov
285 / / 20.09.2000
Цитата:
Originally posted by victor
Проблема в том, что при использовании, скажем конструкции:
if(GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY)
{
...
}
каталоги с флагами Read-Only не попадают в блок обработки.



правильно писать так:

if(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)
{
...
}


а почему мне лень объяснять... :)

584
20 февраля 2007 года
brodotsky
33 / / 25.01.2004
Не стоит лениться людям объяснять...
Ладно, я сам.

Данные на компьютере храняться в виде байтов.
Доступ к отдельным битам можно получить
только при помощи битовых операций.

1. УСТАНОВКА БИТА В 1

бит7-бит6-бит5-бит4-бит3-бит2-бит1-бит0
OR
0-----0-----0----0------1-----0----0-----0
------------------------------------------------
бит7-бит6-бит5-бит4---1---бит2-бит1-бит0

Код на C:
OurVariable = OurVariable | 0x08;

Здесь мы выполнили поразрядную операцию "или".
Цель операции - установить бит3 в 1,
не трогая другие биты.
Весь фокус - в подборе 2-го операнда (00001000=08h).
Бит7, участвуя с нулем в операции "или", не изменяется.
Если там был ноль, то так ноль и останется (0 or 0 = 0).
Если там был один, то так один и останется (1 or 0 = 1).
То же самое со всеми битами, кроме бит3.
Бит3 станет единицей, т.к. все_что_угодно or 1 =1.

Так же устанавливаются в 1 любой другой бит,
только второй операнд будет другой
(для бита0 - 01h, для бита1 - 02h, для бита2 -04h,
для бита4 - 10h, для бита5 - 20h, для бита6 - 40h,
для бита7 - 80h).

2. СБРОС БИТА В 0

бит7-бит6-бит5-бит4-бит3-бит2-бит1-бит0
AND
1-----1-----1----1-----0-----1----1-----1
------------------------------------------------
бит7-бит6-бит5-бит4--0----бит2-бит1-бит0

Код на C:
OurVariable = OurVariable & 0xF7;

Аналогично с предыдущим.
Только операция - "и" (почти как в известном фильме).
Все биты, кроме 3-го, не изменятся -
если был 0, то и останется 0 (0 and 1 = 0);
если был 1, то и останется 1 (1 and 1 = 1).
А вот бит3 обнулится (все_что_угодно and 0 =0).

Как выбирать операнд2 для обнуления других битов:
для бита0 - FEh, для бита1 - FDh, для бита2 - FBh,
для бита4 - EFh, для бита5 - DFh, для бита6 - BFh,
для бита7 - 7Fh.

3. ПРОВЕРКА БИТА

бит7-бит6-бит5-бит4-бит3-бит2-бит1-бит0
AND
0-----0-----0----0-----1-----0----0-----0
------------------------------------------------
0-----0-----0----0----бит3---0----0-----0

Если результат нулевой, то бит3 в исходном байте = 0;
если результат не ноль, то бит3 в исходном байте = 1.

Код на C:
Result=OurVariable & 0x08;
if (Result)
{//результат не ноль,
//значит бит3 в исходном байте = 1
};
else
{//результат нулевой,
//значит бит3 в исходном байте = 0
};

Как это работает?
Когда мы выполнили операцию "и",
все биты результата обнулились, кроме 3-го.
А бит3 результата остался тот же, что у исходного байта.
Если мы убеждаемся, что результат = 0, это означает, что бит3 у результата = 0.
Значит и у исходного байта бит3 = 0.

Если результат - не 0, это означает,
что бит3 у результата = 1
(откуда мы иначе получили бы
ненулевой байт результата,
другие то биты = 0).
Раз у результата бит3 = 1,
то то же самое у исходного байта.

Возвращаемся к коду, упомянутого у Arestovа.

if(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)
{
...
}

Функция GetFileAttributes вернула атрибуты файла.
(Там не один байт, а целых четыре,
но смысла это не меняет).
FILE_ATTRIBUTE_DIRECTORY -
это нужный нам операнд2
(где то там в заголовочных файлах есть определение).
Если получим 0, значит нужный бит = 0.
Если получим не 0, значит и нужный бит = 1.

А если написать
if(GetFileAttributes(path)==FILE_ATTRIBUTE_DIRECTORY)
{
...
}
то работать, конечно, не будет.
Вернее, таким способом можно определить,
является ли файл каталогом,
только если другие атрибуты не установлены.
Если, например, наш файл и Directory, и ReadOnly,
то GetFileAttributes(path)!=FILE_ATTRIBUTE_DIRECTORY
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог