Mercurial > cpython-lru_cache-weakref
annotate Lib/zipfile.py @ 25838:8540887bcec6 2.2
Backport of 2.183:
Fix memory leak in add_subclass() found by NealN with valgrind.
| author | Guido van Rossum <guido@python.org> |
|---|---|
| date | Fri, 18 Oct 2002 13:42:21 +0000 |
| parents | 45e1177424e1 |
| children | fb332a0949b7 e2f2187c3d2c |
| rev | line source |
|---|---|
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
1 "Read and write ZIP files." |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
2 # Written by James C. Ahlstrom jim@interet.com |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
3 # All rights transferred to CNRI pursuant to the Python contribution agreement |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
4 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
5 import struct, os, time |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
6 import binascii |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
7 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
8 try: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
9 import zlib # We may need its compression method |
|
17377
5f68754eb3b6
Try an except: after an import into "except ImportError".
Guido van Rossum <guido@python.org>
parents:
17312
diff
changeset
|
10 except ImportError: |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
11 zlib = None |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
12 |
|
16889
0feb63490093
final round of __all__ lists (I hope) - skipped urllib2 because Moshe may be
Skip Montanaro <skip@pobox.com>
parents:
16840
diff
changeset
|
13 __all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile", |
|
0feb63490093
final round of __all__ lists (I hope) - skipped urllib2 because Moshe may be
Skip Montanaro <skip@pobox.com>
parents:
16840
diff
changeset
|
14 "ZipInfo", "ZipFile", "PyZipFile"] |
|
0feb63490093
final round of __all__ lists (I hope) - skipped urllib2 because Moshe may be
Skip Montanaro <skip@pobox.com>
parents:
16840
diff
changeset
|
15 |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
16 class BadZipfile(Exception): |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
17 pass |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
18 error = BadZipfile # The exception raised by this module |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
19 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
20 # constants for Zip file compression methods |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
21 ZIP_STORED = 0 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
22 ZIP_DEFLATED = 8 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
23 # Other ZIP compression methods not supported |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
24 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
25 # Here are some struct module formats for reading headers |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
26 structEndArchive = "<4s4H2lH" # 9 items, end of archive, 22 bytes |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
27 stringEndArchive = "PK\005\006" # magic number for end of archive record |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
28 structCentralDir = "<4s4B4H3l5H2l"# 19 items, central directory, 46 bytes |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
29 stringCentralDir = "PK\001\002" # magic number for central directory |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
30 structFileHeader = "<4s2B4H3l2H" # 12 items, file header record, 30 bytes |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
31 stringFileHeader = "PK\003\004" # magic number for file header |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
32 |
|
16840
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
33 # indexes of entries in the central directory structure |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
34 _CD_SIGNATURE = 0 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
35 _CD_CREATE_VERSION = 1 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
36 _CD_CREATE_SYSTEM = 2 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
37 _CD_EXTRACT_VERSION = 3 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
38 _CD_EXTRACT_SYSTEM = 4 # is this meaningful? |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
39 _CD_FLAG_BITS = 5 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
40 _CD_COMPRESS_TYPE = 6 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
41 _CD_TIME = 7 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
42 _CD_DATE = 8 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
43 _CD_CRC = 9 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
44 _CD_COMPRESSED_SIZE = 10 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
45 _CD_UNCOMPRESSED_SIZE = 11 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
46 _CD_FILENAME_LENGTH = 12 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
47 _CD_EXTRA_FIELD_LENGTH = 13 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
48 _CD_COMMENT_LENGTH = 14 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
49 _CD_DISK_NUMBER_START = 15 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
50 _CD_INTERNAL_FILE_ATTRIBUTES = 16 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
51 _CD_EXTERNAL_FILE_ATTRIBUTES = 17 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
52 _CD_LOCAL_HEADER_OFFSET = 18 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
53 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
54 # indexes of entries in the local file header structure |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
55 _FH_SIGNATURE = 0 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
56 _FH_EXTRACT_VERSION = 1 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
57 _FH_EXTRACT_SYSTEM = 2 # is this meaningful? |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
58 _FH_GENERAL_PURPOSE_FLAG_BITS = 3 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
59 _FH_COMPRESSION_METHOD = 4 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
60 _FH_LAST_MOD_TIME = 5 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
61 _FH_LAST_MOD_DATE = 6 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
62 _FH_CRC = 7 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
63 _FH_COMPRESSED_SIZE = 8 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
64 _FH_UNCOMPRESSED_SIZE = 9 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
65 _FH_FILENAME_LENGTH = 10 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
66 _FH_EXTRA_FIELD_LENGTH = 11 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
67 |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
68 # Used to compare file passed to ZipFile |
|
20020
b70c08813ba9
Make these modules work when Python is compiled without Unicode support.
Guido van Rossum <guido@python.org>
parents:
19953
diff
changeset
|
69 import types |
|
b70c08813ba9
Make these modules work when Python is compiled without Unicode support.
Guido van Rossum <guido@python.org>
parents:
19953
diff
changeset
|
70 _STRING_TYPES = (types.StringType,) |
|
b70c08813ba9
Make these modules work when Python is compiled without Unicode support.
Guido van Rossum <guido@python.org>
parents:
19953
diff
changeset
|
71 if hasattr(types, "UnicodeType"): |
|
b70c08813ba9
Make these modules work when Python is compiled without Unicode support.
Guido van Rossum <guido@python.org>
parents:
19953
diff
changeset
|
72 _STRING_TYPES = _STRING_TYPES + (types.UnicodeType,) |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
73 |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
74 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
75 def is_zipfile(filename): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
76 """Quickly see if file is a ZIP file by checking the magic number. |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
77 |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
78 Will not accept a ZIP archive with an ending comment. |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
79 """ |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
80 try: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
81 fpin = open(filename, "rb") |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
82 fpin.seek(-22, 2) # Seek to end-of-file record |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
83 endrec = fpin.read() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
84 fpin.close() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
85 if endrec[0:4] == "PK\005\006" and endrec[-2:] == "\000\000": |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
86 return 1 # file has correct magic number |
| 17805 | 87 except IOError: |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
88 pass |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
89 |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
90 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
91 class ZipInfo: |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
92 """Class with attributes describing each file in the ZIP archive.""" |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
93 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
94 def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)): |
|
18746
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
95 self.filename = _normpath(filename) # Name of the file in the archive |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
96 self.date_time = date_time # year, month, day, hour, min, sec |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
97 # Standard values: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
98 self.compress_type = ZIP_STORED # Type of compression for the file |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
99 self.comment = "" # Comment for each file |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
100 self.extra = "" # ZIP extra data |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
101 self.create_system = 0 # System which created ZIP archive |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
102 self.create_version = 20 # Version which created ZIP archive |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
103 self.extract_version = 20 # Version needed to extract archive |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
104 self.reserved = 0 # Must be zero |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
105 self.flag_bits = 0 # ZIP flag bits |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
106 self.volume = 0 # Volume number of file header |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
107 self.internal_attr = 0 # Internal attributes |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
108 self.external_attr = 0 # External file attributes |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
109 # Other attributes are set by class ZipFile: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
110 # header_offset Byte offset to the file header |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
111 # file_offset Byte offset to the start of the file data |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
112 # CRC CRC-32 of the uncompressed file |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
113 # compress_size Size of the compressed file |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
114 # file_size Size of the uncompressed file |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
115 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
116 def FileHeader(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
117 """Return the per-file header as a string.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
118 dt = self.date_time |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
119 dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] |
|
21251
45e1177424e1
SF bug #488514: -Qnew needs work
Tim Peters <tim.peters@gmail.com>
parents:
21098
diff
changeset
|
120 dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
121 if self.flag_bits & 0x08: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
122 # Set these to zero because we write them after the file data |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
123 CRC = compress_size = file_size = 0 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
124 else: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
125 CRC = self.CRC |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
126 compress_size = self.compress_size |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
127 file_size = self.file_size |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
128 header = struct.pack(structFileHeader, stringFileHeader, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
129 self.extract_version, self.reserved, self.flag_bits, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
130 self.compress_type, dostime, dosdate, CRC, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
131 compress_size, file_size, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
132 len(self.filename), len(self.extra)) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
133 return header + self.filename + self.extra |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
134 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
135 |
|
18746
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
136 # This is used to ensure paths in generated ZIP files always use |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
137 # forward slashes as the directory separator, as required by the |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
138 # ZIP format specification. |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
139 if os.sep != "/": |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
140 def _normpath(path): |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
141 return path.replace(os.sep, "/") |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
142 else: |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
143 def _normpath(path): |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
144 return path |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
145 |
|
df9c4c54ef3e
Make sure path names inserted into ZIP files are normalized to use "/" as
Fred Drake <fdrake@acm.org>
parents:
17805
diff
changeset
|
146 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
147 class ZipFile: |
|
17245
0377f927cafa
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17224
diff
changeset
|
148 """ Class with methods to open, read, write, close, list zip files. |
|
0377f927cafa
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17224
diff
changeset
|
149 |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
150 z = ZipFile(file, mode="r", compression=ZIP_STORED) |
|
17245
0377f927cafa
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17224
diff
changeset
|
151 |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
152 file: Either the path to the file, or a file-like object. |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
153 If it is a path, the file will be opened and closed by ZipFile. |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
154 mode: The mode can be either read "r", write "w" or append "a". |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
155 compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib). |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
156 """ |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
157 |
|
16826
a95693491eca
Fix SF tracker bug #403871: AttributeError in ZipFile.__del__() when
Fred Drake <fdrake@acm.org>
parents:
15874
diff
changeset
|
158 fp = None # Set here since __del__ checks it |
|
a95693491eca
Fix SF tracker bug #403871: AttributeError in ZipFile.__del__() when
Fred Drake <fdrake@acm.org>
parents:
15874
diff
changeset
|
159 |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
160 def __init__(self, file, mode="r", compression=ZIP_STORED): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
161 """Open the ZIP file with mode read "r", write "w" or append "a".""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
162 if compression == ZIP_STORED: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
163 pass |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
164 elif compression == ZIP_DEFLATED: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
165 if not zlib: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
166 raise RuntimeError,\ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
167 "Compression requires the (missing) zlib module" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
168 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
169 raise RuntimeError, "That compression method is not supported" |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
170 self.debug = 0 # Level of printing: 0 through 3 |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
171 self.NameToInfo = {} # Find file info given name |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
172 self.filelist = [] # List of ZipInfo instances for archive |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
173 self.compression = compression # Method of compression |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
174 self.mode = key = mode[0] |
|
17245
0377f927cafa
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17224
diff
changeset
|
175 |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
176 # Check if we were passed a file-like object |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
177 if type(file) in _STRING_TYPES: |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
178 self._filePassed = 0 |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
179 self.filename = file |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
180 modeDict = {'r' : 'rb', 'w': 'wb', 'a' : 'r+b'} |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
181 self.fp = open(file, modeDict[mode]) |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
182 else: |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
183 self._filePassed = 1 |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
184 self.fp = file |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
185 self.filename = getattr(file, 'name', None) |
|
17245
0377f927cafa
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
17224
diff
changeset
|
186 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
187 if key == 'r': |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
188 self._GetContents() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
189 elif key == 'w': |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
190 pass |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
191 elif key == 'a': |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
192 fp = self.fp |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
193 fp.seek(-22, 2) # Seek to end-of-file record |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
194 endrec = fp.read() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
195 if endrec[0:4] == stringEndArchive and \ |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
196 endrec[-2:] == "\000\000": |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
197 self._GetContents() # file is a zip file |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
198 # seek to start of directory and overwrite |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
199 fp.seek(self.start_dir, 0) |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
200 else: # file is not a zip file, just append |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
201 fp.seek(0, 2) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
202 else: |
|
17312
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
203 if not self._filePassed: |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
204 self.fp.close() |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
205 self.fp = None |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
206 raise RuntimeError, 'Mode must be "r", "w" or "a"' |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
207 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
208 def _GetContents(self): |
|
17312
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
209 """Read the directory, making sure we close the file if the format |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
210 is bad.""" |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
211 try: |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
212 self._RealGetContents() |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
213 except BadZipfile: |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
214 if not self._filePassed: |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
215 self.fp.close() |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
216 self.fp = None |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
217 raise |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
218 |
|
7635f8838c68
Sf bug [ #412214 ] ZipFile constructor leaves files open.
Tim Peters <tim.peters@gmail.com>
parents:
17245
diff
changeset
|
219 def _RealGetContents(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
220 """Read in the table of contents for the ZIP file.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
221 fp = self.fp |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
222 fp.seek(-22, 2) # Start of end-of-archive record |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
223 filesize = fp.tell() + 22 # Get file size |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
224 endrec = fp.read(22) # Archive must not end with a comment! |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
225 if endrec[0:4] != stringEndArchive or endrec[-2:] != "\000\000": |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
226 raise BadZipfile, "File is not a zip file, or ends with a comment" |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
227 endrec = struct.unpack(structEndArchive, endrec) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
228 if self.debug > 1: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
229 print endrec |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
230 size_cd = endrec[5] # bytes in central directory |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
231 offset_cd = endrec[6] # offset of central directory |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
232 x = filesize - 22 - size_cd |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
233 # "concat" is zero, unless zip was concatenated to another file |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
234 concat = x - offset_cd |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
235 if self.debug > 2: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
236 print "given, inferred, offset", offset_cd, x, concat |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
237 # self.start_dir: Position of start of central directory |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
238 self.start_dir = offset_cd + concat |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
239 fp.seek(self.start_dir, 0) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
240 total = 0 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
241 while total < size_cd: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
242 centdir = fp.read(46) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
243 total = total + 46 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
244 if centdir[0:4] != stringCentralDir: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
245 raise BadZipfile, "Bad magic number for central directory" |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
246 centdir = struct.unpack(structCentralDir, centdir) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
247 if self.debug > 2: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
248 print centdir |
|
16840
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
249 filename = fp.read(centdir[_CD_FILENAME_LENGTH]) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
250 # Create ZipInfo instance to store file information |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
251 x = ZipInfo(filename) |
|
16840
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
252 x.extra = fp.read(centdir[_CD_EXTRA_FIELD_LENGTH]) |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
253 x.comment = fp.read(centdir[_CD_COMMENT_LENGTH]) |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
254 total = (total + centdir[_CD_FILENAME_LENGTH] |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
255 + centdir[_CD_EXTRA_FIELD_LENGTH] |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
256 + centdir[_CD_COMMENT_LENGTH]) |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
257 x.header_offset = centdir[_CD_LOCAL_HEADER_OFFSET] + concat |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
258 # file_offset must be computed below... |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
259 (x.create_version, x.create_system, x.extract_version, x.reserved, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
260 x.flag_bits, x.compress_type, t, d, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
261 x.CRC, x.compress_size, x.file_size) = centdir[1:12] |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
262 x.volume, x.internal_attr, x.external_attr = centdir[15:18] |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
263 # Convert date/time code to (year, month, day, hour, min, sec) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
264 x.date_time = ( (d>>9)+1980, (d>>5)&0xF, d&0x1F, |
|
12919
31c725d70e65
James C. Ahlstron <jim@interet.com>:
Fred Drake <fdrake@acm.org>
parents:
12197
diff
changeset
|
265 t>>11, (t>>5)&0x3F, (t&0x1F) * 2 ) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
266 self.filelist.append(x) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
267 self.NameToInfo[x.filename] = x |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
268 if self.debug > 2: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
269 print "total", total |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
270 for data in self.filelist: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
271 fp.seek(data.header_offset, 0) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
272 fheader = fp.read(30) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
273 if fheader[0:4] != stringFileHeader: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
274 raise BadZipfile, "Bad magic number for file header" |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
275 fheader = struct.unpack(structFileHeader, fheader) |
|
16840
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
276 # file_offset is computed here, since the extra field for |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
277 # the central directory and for the local file header |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
278 # refer to different fields, and they can have different |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
279 # lengths |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
280 data.file_offset = (data.header_offset + 30 |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
281 + fheader[_FH_FILENAME_LENGTH] |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
282 + fheader[_FH_EXTRA_FIELD_LENGTH]) |
|
950fc2261da4
Define lots of constants for indexes into the structures for the file
Fred Drake <fdrake@acm.org>
parents:
16826
diff
changeset
|
283 fname = fp.read(fheader[_FH_FILENAME_LENGTH]) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
284 if fname != data.filename: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
285 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
286 'File name in directory "%s" and header "%s" differ.' % ( |
|
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
287 data.filename, fname) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
288 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
289 def namelist(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
290 """Return a list of file names in the archive.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
291 l = [] |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
292 for data in self.filelist: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
293 l.append(data.filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
294 return l |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
295 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
296 def infolist(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
297 """Return a list of class ZipInfo instances for files in the |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
298 archive.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
299 return self.filelist |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
300 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
301 def printdir(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
302 """Print a table of contents for the zip file.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
303 print "%-46s %19s %12s" % ("File Name", "Modified ", "Size") |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
304 for zinfo in self.filelist: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
305 date = "%d-%02d-%02d %02d:%02d:%02d" % zinfo.date_time |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
306 print "%-46s %s %12d" % (zinfo.filename, date, zinfo.file_size) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
307 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
308 def testzip(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
309 """Read all the files and check the CRC.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
310 for zinfo in self.filelist: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
311 try: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
312 self.read(zinfo.filename) # Check CRC-32 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
313 except: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
314 return zinfo.filename |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
315 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
316 def getinfo(self, name): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
317 """Return the instance of ZipInfo given 'name'.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
318 return self.NameToInfo[name] |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
319 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
320 def read(self, name): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
321 """Return file bytes (as a string) for name.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
322 if self.mode not in ("r", "a"): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
323 raise RuntimeError, 'read() requires mode "r" or "a"' |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
324 if not self.fp: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
325 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
326 "Attempt to read ZIP archive that was already closed" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
327 zinfo = self.getinfo(name) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
328 filepos = self.fp.tell() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
329 self.fp.seek(zinfo.file_offset, 0) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
330 bytes = self.fp.read(zinfo.compress_size) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
331 self.fp.seek(filepos, 0) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
332 if zinfo.compress_type == ZIP_STORED: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
333 pass |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
334 elif zinfo.compress_type == ZIP_DEFLATED: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
335 if not zlib: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
336 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
337 "De-compression requires the (missing) zlib module" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
338 # zlib compress/decompress code by Jeremy Hylton of CNRI |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
339 dc = zlib.decompressobj(-15) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
340 bytes = dc.decompress(bytes) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
341 # need to feed in unused pad byte so that zlib won't choke |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
342 ex = dc.decompress('Z') + dc.flush() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
343 if ex: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
344 bytes = bytes + ex |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
345 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
346 raise BadZipfile, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
347 "Unsupported compression method %d for file %s" % \ |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
348 (zinfo.compress_type, name) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
349 crc = binascii.crc32(bytes) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
350 if crc != zinfo.CRC: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
351 raise BadZipfile, "Bad CRC-32 for file %s" % name |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
352 return bytes |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
353 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
354 def _writecheck(self, zinfo): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
355 """Check for errors before writing a file to the archive.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
356 if self.NameToInfo.has_key(zinfo.filename): |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
357 if self.debug: # Warning for duplicate names |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
358 print "Duplicate name:", zinfo.filename |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
359 if self.mode not in ("w", "a"): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
360 raise RuntimeError, 'write() requires mode "w" or "a"' |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
361 if not self.fp: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
362 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
363 "Attempt to write ZIP archive that was already closed" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
364 if zinfo.compress_type == ZIP_DEFLATED and not zlib: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
365 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
366 "Compression requires the (missing) zlib module" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
367 if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
368 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
369 "That compression method is not supported" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
370 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
371 def write(self, filename, arcname=None, compress_type=None): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
372 """Put the bytes from filename into the archive under the name |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
373 arcname.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
374 st = os.stat(filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
375 mtime = time.localtime(st[8]) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
376 date_time = mtime[0:6] |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
377 # Create ZipInfo instance to store file information |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
378 if arcname is None: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
379 zinfo = ZipInfo(filename, date_time) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
380 else: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
381 zinfo = ZipInfo(arcname, date_time) |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
382 zinfo.external_attr = st[0] << 16 # Unix attributes |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
383 if compress_type is None: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
384 zinfo.compress_type = self.compression |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
385 else: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
386 zinfo.compress_type = compress_type |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
387 self._writecheck(zinfo) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
388 fp = open(filename, "rb") |
|
19737
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
389 zinfo.flag_bits = 0x00 |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
390 zinfo.header_offset = self.fp.tell() # Start of header bytes |
|
19737
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
391 # Must overwrite CRC and sizes with correct data later |
|
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
392 zinfo.CRC = CRC = 0 |
|
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
393 zinfo.compress_size = compress_size = 0 |
|
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
394 zinfo.file_size = file_size = 0 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
395 self.fp.write(zinfo.FileHeader()) |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
396 zinfo.file_offset = self.fp.tell() # Start of file bytes |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
397 if zinfo.compress_type == ZIP_DEFLATED: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
398 cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
399 zlib.DEFLATED, -15) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
400 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
401 cmpr = None |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
402 while 1: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
403 buf = fp.read(1024 * 8) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
404 if not buf: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
405 break |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
406 file_size = file_size + len(buf) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
407 CRC = binascii.crc32(buf, CRC) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
408 if cmpr: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
409 buf = cmpr.compress(buf) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
410 compress_size = compress_size + len(buf) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
411 self.fp.write(buf) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
412 fp.close() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
413 if cmpr: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
414 buf = cmpr.flush() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
415 compress_size = compress_size + len(buf) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
416 self.fp.write(buf) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
417 zinfo.compress_size = compress_size |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
418 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
419 zinfo.compress_size = file_size |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
420 zinfo.CRC = CRC |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
421 zinfo.file_size = file_size |
|
19737
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
422 # Seek backwards and write CRC and file sizes |
|
19953
0f9df563b65d
Whitespace normalization.
Tim Peters <tim.peters@gmail.com>
parents:
19737
diff
changeset
|
423 position = self.fp.tell() # Preserve current position in file |
|
19737
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
424 self.fp.seek(zinfo.header_offset + 14, 0) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
425 self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
426 zinfo.file_size)) |
|
19737
56c549a253a6
[ #458701 ] Patch to zipfile.py for Java
Finn Bock <bckfnn@worldonline.dk>
parents:
18746
diff
changeset
|
427 self.fp.seek(position, 0) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
428 self.filelist.append(zinfo) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
429 self.NameToInfo[zinfo.filename] = zinfo |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
430 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
431 def writestr(self, zinfo, bytes): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
432 """Write a file into the archive. The contents is the string |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
433 'bytes'.""" |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
434 self._writecheck(zinfo) |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
435 zinfo.file_size = len(bytes) # Uncompressed size |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
436 zinfo.CRC = binascii.crc32(bytes) # CRC-32 checksum |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
437 if zinfo.compress_type == ZIP_DEFLATED: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
438 co = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
439 zlib.DEFLATED, -15) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
440 bytes = co.compress(bytes) + co.flush() |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
441 zinfo.compress_size = len(bytes) # Compressed size |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
442 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
443 zinfo.compress_size = zinfo.file_size |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
444 zinfo.header_offset = self.fp.tell() # Start of header bytes |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
445 self.fp.write(zinfo.FileHeader()) |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
446 zinfo.file_offset = self.fp.tell() # Start of file bytes |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
447 self.fp.write(bytes) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
448 if zinfo.flag_bits & 0x08: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
449 # Write CRC and file sizes after the file data |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
450 self.fp.write(struct.pack("<lll", zinfo.CRC, zinfo.compress_size, |
|
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
451 zinfo.file_size)) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
452 self.filelist.append(zinfo) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
453 self.NameToInfo[zinfo.filename] = zinfo |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
454 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
455 def __del__(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
456 """Call the "close()" method in case the user forgot.""" |
|
21098
82d8413636e7
SF bug 486480: zipfile __del__ is broken
Tim Peters <tim.peters@gmail.com>
parents:
20020
diff
changeset
|
457 self.close() |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
458 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
459 def close(self): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
460 """Close the file, and for mode "w" and "a" write the ending |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
461 records.""" |
|
21098
82d8413636e7
SF bug 486480: zipfile __del__ is broken
Tim Peters <tim.peters@gmail.com>
parents:
20020
diff
changeset
|
462 if self.fp is None: |
|
82d8413636e7
SF bug 486480: zipfile __del__ is broken
Tim Peters <tim.peters@gmail.com>
parents:
20020
diff
changeset
|
463 return |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
464 if self.mode in ("w", "a"): # write ending records |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
465 count = 0 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
466 pos1 = self.fp.tell() |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
467 for zinfo in self.filelist: # write central directory |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
468 count = count + 1 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
469 dt = zinfo.date_time |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
470 dosdate = (dt[0] - 1980) << 9 | dt[1] << 5 | dt[2] |
|
21251
45e1177424e1
SF bug #488514: -Qnew needs work
Tim Peters <tim.peters@gmail.com>
parents:
21098
diff
changeset
|
471 dostime = dt[3] << 11 | dt[4] << 5 | (dt[5] // 2) |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
472 centdir = struct.pack(structCentralDir, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
473 stringCentralDir, zinfo.create_version, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
474 zinfo.create_system, zinfo.extract_version, zinfo.reserved, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
475 zinfo.flag_bits, zinfo.compress_type, dostime, dosdate, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
476 zinfo.CRC, zinfo.compress_size, zinfo.file_size, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
477 len(zinfo.filename), len(zinfo.extra), len(zinfo.comment), |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
478 0, zinfo.internal_attr, zinfo.external_attr, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
479 zinfo.header_offset) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
480 self.fp.write(centdir) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
481 self.fp.write(zinfo.filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
482 self.fp.write(zinfo.extra) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
483 self.fp.write(zinfo.comment) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
484 pos2 = self.fp.tell() |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
485 # Write end-of-zip-archive record |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
486 endrec = struct.pack(structEndArchive, stringEndArchive, |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
487 0, 0, count, count, pos2 - pos1, pos1, 0) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
488 self.fp.write(endrec) |
|
17517
1e23d91c0a82
Mark Favas points out that there's an 'self.fp.flush()' call in the
Guido van Rossum <guido@python.org>
parents:
17377
diff
changeset
|
489 self.fp.flush() |
|
17224
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
490 if not self._filePassed: |
|
f9395f7627c4
Itamar Shtull-Trauring <itamar@maxnm.com>:
Fred Drake <fdrake@acm.org>
parents:
16889
diff
changeset
|
491 self.fp.close() |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
492 self.fp = None |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
493 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
494 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
495 class PyZipFile(ZipFile): |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
496 """Class to create ZIP archives with Python library files and packages.""" |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
497 |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
498 def writepy(self, pathname, basename = ""): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
499 """Add all files from "pathname" to the ZIP archive. |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
500 |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
501 If pathname is a package directory, search the directory and |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
502 all package subdirectories recursively for all *.py and enter |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
503 the modules into the archive. If pathname is a plain |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
504 directory, listdir *.py and enter all modules. Else, pathname |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
505 must be a Python *.py file and the module will be put into the |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
506 archive. Added modules are always module.pyo or module.pyc. |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
507 This method will compile the module.py into module.pyc if |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
508 necessary. |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
509 """ |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
510 dir, name = os.path.split(pathname) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
511 if os.path.isdir(pathname): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
512 initname = os.path.join(pathname, "__init__.py") |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
513 if os.path.isfile(initname): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
514 # This is a package directory, add it |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
515 if basename: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
516 basename = "%s/%s" % (basename, name) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
517 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
518 basename = name |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
519 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
520 print "Adding package in", pathname, "as", basename |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
521 fname, arcname = self._get_codename(initname[0:-3], basename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
522 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
523 print "Adding", arcname |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
524 self.write(fname, arcname) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
525 dirlist = os.listdir(pathname) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
526 dirlist.remove("__init__.py") |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
527 # Add all *.py files and package subdirectories |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
528 for filename in dirlist: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
529 path = os.path.join(pathname, filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
530 root, ext = os.path.splitext(filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
531 if os.path.isdir(path): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
532 if os.path.isfile(os.path.join(path, "__init__.py")): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
533 # This is a package directory, add it |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
534 self.writepy(path, basename) # Recursive call |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
535 elif ext == ".py": |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
536 fname, arcname = self._get_codename(path[0:-3], |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
537 basename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
538 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
539 print "Adding", arcname |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
540 self.write(fname, arcname) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
541 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
542 # This is NOT a package directory, add its files at top level |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
543 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
544 print "Adding files from directory", pathname |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
545 for filename in os.listdir(pathname): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
546 path = os.path.join(pathname, filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
547 root, ext = os.path.splitext(filename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
548 if ext == ".py": |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
549 fname, arcname = self._get_codename(path[0:-3], |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
550 basename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
551 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
552 print "Adding", arcname |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
553 self.write(fname, arcname) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
554 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
555 if pathname[-3:] != ".py": |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
556 raise RuntimeError, \ |
|
14933
715a3e924737
Always use the same name for the exception defined in this module!
Fred Drake <fdrake@acm.org>
parents:
12919
diff
changeset
|
557 'Files added with writepy() must end with ".py"' |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
558 fname, arcname = self._get_codename(pathname[0:-3], basename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
559 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
560 print "Adding file", arcname |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
561 self.write(fname, arcname) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
562 |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
563 def _get_codename(self, pathname, basename): |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
564 """Return (filename, archivename) for the path. |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
565 |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
566 Given a module name path, return the correct file path and |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
567 archive name, compiling if necessary. For example, given |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
568 /python/lib/string, return (/python/lib/string.pyc, string). |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
569 """ |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
570 file_py = pathname + ".py" |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
571 file_pyc = pathname + ".pyc" |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
572 file_pyo = pathname + ".pyo" |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
573 if os.path.isfile(file_pyo) and \ |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
574 os.stat(file_pyo)[8] >= os.stat(file_py)[8]: |
|
15874
4c01ee0a8073
Whitespace normalization. Top level of Lib now fixed-point for reindent.py!
Tim Peters <tim.peters@gmail.com>
parents:
14975
diff
changeset
|
575 fname = file_pyo # Use .pyo file |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
576 elif not os.path.isfile(file_pyc) or \ |
|
14975
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
577 os.stat(file_pyc)[8] < os.stat(file_py)[8]: |
|
27eab8032766
Delay import of py_compile until needed, since is is only used by the
Fred Drake <fdrake@acm.org>
parents:
14933
diff
changeset
|
578 import py_compile |
|
12197
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
579 if self.debug: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
580 print "Compiling", file_py |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
581 py_compile.compile(file_py, file_pyc) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
582 fname = file_pyc |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
583 else: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
584 fname = file_pyc |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
585 archivename = os.path.split(fname)[1] |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
586 if basename: |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
587 archivename = "%s/%s" % (basename, archivename) |
|
7f18f979a93a
Zip file handling module, by Jim Ahlstrom.
Guido van Rossum <guido@python.org>
parents:
diff
changeset
|
588 return (fname, archivename) |
