File: gdal_zip.py

package info (click to toggle)
gdal 3.6.2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 89,664 kB
  • sloc: cpp: 1,136,033; ansic: 197,355; python: 35,910; java: 5,511; xml: 4,011; sh: 3,950; cs: 2,443; yacc: 1,047; makefile: 288
file content (134 lines) | stat: -rw-r--r-- 4,069 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/usr/bin/env python3
###############################################################################
# $Id$
#
#  Project:  GDAL samples
#  Purpose:  Create a zip file
#  Author:   Even Rouault <even dot rouault at spatialys dot com>
#
###############################################################################
#  Copyright (c) 2018, Even Rouault <even dot rouault at spatialys dot com>
#
#  Permission is hereby granted, free of charge, to any person obtaining a
#  copy of this software and associated documentation files (the "Software"),
#  to deal in the Software without restriction, including without limitation
#  the rights to use, copy, modify, merge, publish, distribute, sublicense,
#  and/or sell copies of the Software, and to permit persons to whom the
#  Software is furnished to do so, subject to the following conditions:
#
#  The above copyright notice and this permission notice shall be included
#  in all copies or substantial portions of the Software.
#
#  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
#  OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
#  THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
#  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
#  DEALINGS IN THE SOFTWARE.
###############################################################################

import sys

from osgeo import gdal


def Usage():
    print("Usage: gdal_zip [-r] zip_filename source_file*")
    return 2


def copy_file(srcfile, targetfile, recurse):

    if recurse:
        subfiles = gdal.ReadDir(srcfile)
        if subfiles:
            for subfile in subfiles:
                if (
                    subfile != "."
                    and subfile != ".."
                    and not copy_file(srcfile + "/" + subfile, targetfile, True)
                ):
                    return False
            return True

    fin = gdal.VSIFOpenL(srcfile, "rb")
    if not fin:
        print("Cannot open " + srcfile)
        return False

    fout = gdal.VSIFOpenL(targetfile + "/" + srcfile, "wb")
    if not fout:
        print("Cannot create " + targetfile + "/" + srcfile)
        gdal.VSIFCloseL(fin)
        return False

    buf_max_size = 4096
    ret = True
    copied = 0
    while True:
        buf = gdal.VSIFReadL(1, buf_max_size, fin)
        if buf is None:
            if copied == 0:
                print("Cannot read from%s" % srcfile)
                ret = False
            break
        buf_size = len(buf)
        if gdal.VSIFWriteL(buf, 1, buf_size, fout) != buf_size:
            print("Error writing %d bytes" % buf_size)
            ret = False
            break
        copied += buf_size
        if buf_size != buf_max_size:
            break

    gdal.VSIFCloseL(fin)
    gdal.VSIFCloseL(fout)
    return ret


def gdal_zip(argv, progress=None):
    srcfiles = []
    targetfile = None
    recurse = False

    argv = gdal.GeneralCmdLineProcessor(argv)
    if argv is None:
        return -1

    if gdal.GetConfigOption("GDAL_NUM_THREADS") is None:
        gdal.SetConfigOption("GDAL_NUM_THREADS", "ALL_CPUS")

    for i in range(1, len(argv)):
        if argv[i] == "-r":
            recurse = True
        elif argv[i][0] == "-":
            print("Unrecognized option : %s" % argv[i])
            return Usage()
        elif targetfile is None:
            targetfile = argv[i]
        else:
            srcfiles.append(argv[i])

    if not srcfiles or targetfile is None:
        return Usage()

    if not targetfile.endswith(".zip"):
        targetfile += ".zip"
    targetfile = "/vsizip/" + targetfile

    ret = 0
    for srcfile in srcfiles:
        if not copy_file(srcfile, targetfile, recurse):
            ret = 1
            break

    return ret


def main(argv=sys.argv):
    return gdal_zip(argv)


if __name__ == "__main__":
    sys.exit(main(sys.argv))