Bu biraz egzotik bir sorudur, ancak bu konuda net bilgi bulunmuyor. Ben sadece zip formatının harici dosya özniteliği hakkındaki bir soruya bir cevap ekledim . Cevabımdan da anlaşılacağı gibi, sadece ikinci baytın (4 bayt) Unix için kullanıldığına karar verdim. Görünüşe göre bu, nesnenin bir dosya mı yoksa bir dizin mi olduğunu ortaya çıkarmak için açarken yeterli bilgi içeriyor ve ayrıca diğer izin ve nitelik bilgileri için de alana sahip. Sorum şu, bu Unix izinlerine nasıl bakıyor? ls
Tam olarak bir bayta sığacak olan her zamanki Unix izinleri (örn. Aşağıda) var mı ve eğer öyleyse, birisi düzeni açıklayabilir veya referans verebilir mi?
$ 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
Belirli bir soru sorarak bunu daha somutlaştırmama izin verin. Yukarıdaki cevabımda belirtilen Trac yaması uyarınca, aşağıdaki Python pasajına sahip bir zip dosyası oluşturabilirsiniz.
040755 << 16L
Değeri izinlerine sahip boş bir dizin oluşturulması tekabül drwxr-xr-x
. (Test ettim). Desene 0755
karşılık geldiğini biliyorum rwxr-xr-x
, ama peki ya 04
tüm değer byte'a ne kadar karşılık gelir? Ayrıca << 16L
16 yerin bitsel sola kaymasına karşılık geldiğini ve bu durumun en üstteki bayttan ikinci olarak çıkacağını biliyorum.
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()
EDIT: Bunu tekrar okuduğumda, Unix izinlerinin sadece bir bayta karşılık geldiği sonucumun yanlış olabileceğini düşünüyorum, fakat doğru cevabın ne olduğundan emin olamadığım için yukarıdakilerin şimdiki zaman için geçerli olmasına izin vereceğim.
EDIT2: Sadece 1 byte'a karşılık gelen Unix değerleri konusunda gerçekten yanılmışım. @ Random832'de açıklandığı gibi, ilk iki baytın her ikisini de kullanır. @ Random832'nin cevabına göre, 040755
aşağıda verilen tablolardan istenen değeri oluşturabiliriz. Yani:
__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