Странное значение атрибута, сообщаемое findFirst(), Attr = 2080
-
18-09-2019 - |
Вопрос
При поиске файлов с помощью findFirst() я получаю значение атрибута в TSearchRec.Поле Attr 2080.Это не указано в справке, поскольку доступны только эти значения, и никакая их комбинация не дает 2080:
1 Плата за проезд только
2 фаХидден
4 Файл faSysFile
8 фаВолумеЙД
16 Директория
32 Архивация
64 Ссылка на faSymLink
71 фаАниФайл
Кто-нибудь знает, что означает 2080 и почему я получаю это значение атрибута?Операционная система является встроенной в XP.
Решение
Оказывается, что файл, найденный 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 id десятичный, а 2080 dec = 820 шестнадцатеричный, тогда атрибуты представляют собой комбинацию:
faArchive = $00000020;
faCompressed = $00000800;
Это извлечет бит faDirectory, и вам не придется беспокоиться о том, установлен бит сжатия или нет.
if ((sr.Attr AND faDirectory) <> 0) then
begin
.......
end;