Это немного экзотический вопрос, но в сети не так много информации об этом. Я только добавил ответ на вопрос об атрибуте внешнего файла в формате 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 .