python中zipfile的使用_Python中的Zipfile文件权限

相关的Python问题提供了一些关于问题首先存在的原因的见解:https://bugs.python.org/issue18262和{a2}

重要部分包括:4.4.2 version made by (2 bytes)

4.4.2.1 The upper byte indicates the compatibility of the file

attribute information. If the external file attributes

are compatible with MS-DOS and can be read by PKZIP for

DOS version 2.04g then this value will be zero. If these

attributes are not compatible, then this value will

identify the host system on which the attributes are

compatible. Software can use this information to determine

the line record format for text files etc.

4.4.2.2 The current mappings are:

0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)

1 - Amiga 2 - OpenVMS

3 - UNIX 4 - VM/CMS

5 - Atari ST 6 - OS/2 H.P.F.S.

7 - Macintosh 8 - Z-System

9 - CP/M 10 - Windows NTFS

11 - MVS (OS/390 - Z/OS) 12 - VSE

13 - Acorn Risc 14 - VFAT

15 - alternate MVS 16 - BeOS

17 - Tandem 18 - OS/400

19 - OS X (Darwin) 20 thru 255 - unused

...

4.4.15 external file attributes: (4 bytes)

The mapping of the external attributes is

host-system dependent (see 'version made by'). For

MS-DOS, the low order byte is the MS-DOS directory

attribute byte. If input came from standard input, this

field is set to zero.

这意味着外部文件属性是特定于系统的。解释不同系统的外部文件属性可能会使情况更糟。如果我们只关心UNIX,我们可以检查ZipInfo.created_system,并将其与3(对于UNIX)进行比较。不幸的是,规范并不能帮助我们进一步解释外部属性。在

虽然这是一个相当观察性的问题,但这似乎是共识。在

把这些放在一起:from zipfile import ZipFile

ZIP_UNIX_SYSTEM = 3

def extract_all_with_permission(zf, target_dir):

for info in zf.infolist():

extracted_path = zf.extract(info, target_dir)

if info.create_system == ZIP_UNIX_SYSTEM:

unix_attributes = info.external_attr >> 16

if unix_attributes:

os.chmod(extracted_path, unix_attributes)

with ZipFile('sample.zip', 'r') as zf:

extract_all_with_permission(zf, '/tmp')

可能会出现一个问题,为什么我们要首先保留权限。有些人可能敢说我们只想保留可执行标志。在这种情况下,一个稍微安全一点的选择是只恢复可执行标志,仅用于文件。在from zipfile import ZipFile

from stat import S_IXUSR

ZIP_UNIX_SYSTEM = 3

def extract_all_with_executable_permission(zf, target_dir):

for info in zf.infolist():

extracted_path = zf.extract(info, target_dir)

if info.create_system == ZIP_UNIX_SYSTEM and os.path.isfile(extracted_path):

unix_attributes = info.external_attr >> 16

if unix_attributes & S_IXUSR:

os.chmod(extracted_path, os.stat(extracted_path).st_mode | S_IXUSR)

with ZipFile('sample.zip', 'r') as zf:

extract_all_with_executable_permission(zf, '/tmp')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值