Это немного экзотический вопрос, но в сети не так много информации об этом. Я только добавил ответ на вопрос об атрибуте внешнего файла в формате zip . Как вы можете видеть из моего ответа, я заключаю, что только второй байт (из 4 байтов) фактически используется для Unix. Очевидно, что при разархивировании он содержит достаточно информации, чтобы определить, является ли объект файлом или каталогом, а также имеет место для другой информации о разрешениях и атрибутах. Мой вопрос, как это соотносится с обычными разрешениями Unix? Имеют ли обычные разрешения Unix (например, ниже), которые ls
соответствуют вписанию ровно в один байт, и если да, может кто-нибудь описать схему или дать ссылку, пожалуйста?
$ ls -la
total 36
drwxr-xr-x 3 faheem faheem 4096 Jun 10 01:11 .
drwxrwxrwt 136 root root 28672 Jun 10 01:07 ..
-rw-r--r-- 1 faheem faheem 0 Jun 10 01:07 a
drwxr-xr-x 2 faheem faheem 4096 Jun 10 01:07 b
lrwxrwxrwx 1 faheem faheem 1 Jun 10 01:11 c -> b
Позвольте мне сделать это более конкретным, задав конкретный вопрос. Согласно патчу Trac, указанному в моем ответе выше, вы можете создать zip-файл с фрагментом Python ниже.
040755 << 16L
Значение соответствует созданию пустого каталога с разрешениями drwxr-xr-x
. (Я проверял это). Я узнаю, 0755
соответствует rwxr-xr-x
шаблону, но как насчет 04
, и как все значение соответствует байту? Я также узнаю, что << 16L
соответствует сдвигу в 16 бит по левому краю, что делает его вторым из старшего байта.
def makezip1():
import zipfile
z = zipfile.ZipFile("foo.zip", mode = 'w')
zfi = zipfile.ZipInfo("foo/empty/")
zfi.external_attr = 040755 << 16L # permissions drwxr-xr-x
z.writestr(zfi, "")
print z.namelist()
z.close()
РЕДАКТИРОВАТЬ: Перечитывая это, я думаю, что мой вывод о том, что разрешения Unix соответствуют только одному байту, может быть неправильным, но я позволю вышеизложенному обозначать настоящее, поскольку я не уверен, каков правильный ответ.
РЕДАКТИРОВАТЬ 2: Я действительно был неправ в отношении значений Unix, соответствующих только 1 байт. Как объяснил @ Random832, он использует оба верхних байта. Согласно ответу @ Random832, мы можем построить желаемое 040755
значение из таблиц, которые он дает ниже. А именно:
__S_IFDIR + S_IRUSR + S_IWUSR + S_IXUSR + S_IRGRP + S_IXGRP + S_IROTH + S_IXOTH
0040000 + 0400 + 0200 + 0100 + 0040 + 0010 + 0004 + 0001
= 40755
Дополнение здесь находится в базе 8 .
Ответы:
0040000
является традиционным значениемS_IFDIR
флага типа файла, представляющего каталог. Тип использует верхние 4 бита 16-битногоst_mode
значения,0100000
это значение для обычных файлов.Высокие 16 битов атрибутов внешнего файла, похоже, используются для разрешений, специфичных для ОС. Значения Unix такие же, как в традиционных реализациях Unix. Другие ОС используют другие значения. Информация о форматах , используемых в различных операционных систем можно найти в исходном коде Info-ZIP ( загрузить или , например , в DEBiAN
apt-get source [zip or unzip]
) - соответствующие файлы находятсяzipinfo.c
вunzip
, и платформы конкретные файлыzip
.Они условно определены в восьмеричном (основание 8); это представлено в C и Python путем добавления префикса числа к
0
.Эти значения могут быть найдены в
<sys/stat.h>
- ссылка на 4.4BSD версии . Они не входят в стандарт POSIX (который вместо этого определяет тестовые макросы); но происходят из AT & T Unix и BSD. (в GNU libc / Linux сами значения определены как и__S_IFDIR
т. д.bits/stat.h
, хотя заголовок ядра может быть проще для чтения - все эти значения практически одинаковы везде).И, конечно же, остальные 12 битов предназначены для прав доступа и битов setuid / setgid / sticky, так же, как для chmod:
Как историческое примечание, причина
0100000
для обычных файлов вместо 0 заключается в том, что в очень ранних версиях Unix 0 был для «маленьких» файлов (они не использовали косвенные блоки в файловой системе), а старший бит флага режима был установить для «больших» файлов, которые будут использовать косвенные блоки. Два других типа, использующих этот бит, были добавлены в более поздние Unix-производные ОС после изменения файловой системы.Итак, в заключение, общий макет поля расширенных атрибутов для Unix:
источник
040755 << 16L
строится значение ? В частности, какое представление / основание оно использует (я думаю, что возможно Octal ), и, самое главное, как язык (в данном случае интерпретатор Python) знает, что такое представление? Хм, может быть, тип объявлен в коде C. Кроме того, из какого файла вы получаете значения типа файла? Добавление некоторых ссылок / ссылок было бы полезно.zipinfo.c
это источник Unzip в Debian . В качестве альтернативы можно использовать более удобныйapt-get source unzip
. Вы можете добавить это к своему ответу или использовать сторонний источник. Я обычно цитирую Debian, потому что я верю, что они будут здесь надолго. :-)040755
. Это стоило бы упомянуть imo для людей, которые не знают или забыли. Конечно, это все еще оставляет вопрос о том, как он знает, что это база 8, но, возможно, тип объявлен как база 8.stat.h
Файл на Linux (я предполагаю , что правильный файл является/usr/include/sys/stat.h
) не содержит определения этих констант в такой ясной, как файл вы связаны. Они спрятаны где-то еще? Я вижу, вы использовали этот терминtest macros
, но я не уверен, что это значит.