Как определить является файл каталогом или нет?
if(GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY)
{
...
}
каталоги с флагами Read-Only не попадают в блок обработки.
Цитата:
Originally posted by victor
Проблема в том, что при использовании, скажем конструкции:
if(GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY)
{
...
}
каталоги с флагами Read-Only не попадают в блок обработки.
Проблема в том, что при использовании, скажем конструкции:
if(GetFileAttributes(path) == FILE_ATTRIBUTE_DIRECTORY)
{
...
}
каталоги с флагами Read-Only не попадают в блок обработки.
правильно писать так:
if(GetFileAttributes(path) & FILE_ATTRIBUTE_DIRECTORY)
{
...
}
а почему мне лень объяснять... :)
Ладно, я сам.
Данные на компьютере храняться в виде байтов.
Доступ к отдельным битам можно получить
только при помощи битовых операций.
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