Странное значение атрибута, сообщаемое FindFirst(), Attr = 2080
При поиске файлов с помощью FindFirst() я получаю значение атрибута в поле TSearchRec.Attr, равное 2080. Оно не указано в справке, поскольку доступны только эти значения, и ни одна из их комбинаций не дает 2080:
1 faReadOnly
2 скрытый
4 faSysFile
8 faVolumeID
16 faDirectory
32 faArchive
64 faSymLink
71 faAnyFile
Кто-нибудь знает, что означает 2080 и почему я получаю это значение атрибута? ОС является XP встроенной.
4 ответа
Оказывается, что файл, найденный FindFirst(), был сжат и, таким образом, был установлен сжатый бит. Мне потребовалось некоторое время, чтобы разобраться, и я не смог найти в Интернете ссылку, в которой указано действительное значение TSearchRec.Attr, когда установлен сжатый бит. Отключение "Сжать файл" в расширенных свойствах файлов сделало свое дело.
Атрибуты в TSearchRec
сопоставить непосредственно с атрибутами файлов Windows, используемыми с TWin32FindData
запись из FindFirstFile
,
В шестнадцатеричном формате (всегда отображать битовые поля в шестнадцатеричном, а не десятичном виде) 2080 - это $0820, где ясно, что установлены два бита. Младший бит соответствует File_Attribute_Archive
или Delphi's faArchive
, а верхний бит соответствует File_Attribute_Compressed
, Он не имеет эквивалента в модулях, поставляемых с Delphi, но вы можете использовать JclFileUtils.faCompressed
символ из JCL.
В JclFileUtils
Блок из библиотеки кодов джедаев, который я нашел:
faNormalFile = $00000080;
...
faNotContentIndexed = $00002000;
Если 2080 в шестнадцатеричном, то это оно.
Смотрите также: http://www.tek-tips.com/viewthread.cfm?qid=1543818&page=9
РЕДАКТИРОВАТЬ: в то время как 2080 идентификатор десятичного числа и 2080 dec = 820 шестнадцатеричные, тогда атрибуты являются комбинацией
faArchive = $00000020;
faCompressed = $00000800;
Это извлечет бит faDirectory, и вам не нужно беспокоиться о том, установлен бит сжатия или нет.
if ((sr.Attr AND faDirectory) <> 0) then
begin
.......
end;