Странное значение атрибута, сообщаемое FindFirst (), Attr = 2080 - PullRequest
3 голосов
/ 05 января 2010

При поиске файлов с помощью FindFirst () я получаю значение атрибута в поле TSearchRec.Attr, равное 2080. Оно не указано в справке, поскольку доступны только эти значения, и ни одна из них не дает 2080:

1 faReadOnly
2 faHidden
4 faSysFile
8 faVolumeID
16 faDirectory
32 faArchive
64 faSymLink
71 faAnyFile

Кто-нибудь знает, что означает 2080 и почему я получаю значение этого атрибута? В ОС установлена ​​XP.

Ответы [ 4 ]

6 голосов
/ 05 января 2010

Оказывается, что файл, найденный FindFirst (), был сжат и, таким образом, был установлен сжатый бит. Мне потребовалось некоторое время, чтобы разобраться, и я не смог найти в Интернете ссылку, в которой указано действительное значение TSearchRec.Attr, когда установлен сжатый бит. Отключение «Сжать файл» в расширенных свойствах файлов сделало свое дело.

5 голосов
/ 05 января 2010

Атрибуты в TSearchRec отображаются непосредственно на Атрибуты файла Windows , используемые с TWin32FindData записью из FindFirstFile .

В шестнадцатеричном формате (всегда отображать битовые поля в шестнадцатеричном, а не десятичном), 2080 - это $ 0820, где ясно, что установлены два бита. Младший бит соответствует File_Attribute_Archive или Delphi faArchive, а верхний бит соответствует File_Attribute_Compressed. Он не имеет эквивалента в единицах, поставляемых с Delphi, но вы можете использовать символ JclFileUtils.faCompressed из JCL .

3 голосов
/ 05 января 2010

В JclFileUtils единица из библиотеки кодов джедаев, которую я нашел:

faNormalFile        = $00000080;
...
faNotContentIndexed = $00002000;

Если 2080 в шестнадцатеричном, то это оно.

Смотрите также: http://www.tek -tips.com / viewthread.cfm? Qid = 1543818 & page = 9

EDIT: В то время как 2080 id десятичный, а 2080 dec = 820 шестнадцатеричный, атрибуты являются комбинацией:

 faArchive     = $00000020;
 faCompressed  = $00000800;
1 голос
/ 28 сентября 2011

Это извлечет бит faDirectory, и вам не нужно беспокоиться о том, установлен бит сжатия или нет.

if ((sr.Attr AND faDirectory) <> 0) then

begin 
     .......
end;
...