
Although "macOS" is the correct name for Apple's current desktop OS, we've decided to go with "Mac OS" to cover all of Apple's Unix-like desktop OS versions. The label "Mac OS" is more readable, clear in context (i.e., unlikely to be confused with the Mac OSes that proceeded Mac OS X), and as likely to match Apple's future OS names as anything.
99 lines
4.5 KiB
Racket
99 lines
4.5 KiB
Racket
#lang scribble/doc
|
|
@(require "common.rkt" (for-label file/zip file/gzip file/gunzip scheme/file))
|
|
|
|
@title[#:tag "zip"]{@exec{zip} File Creation}
|
|
|
|
@defmodule[file/zip]{The @racketmodname[file/zip] library provides
|
|
utilities to create @exec{zip} archive files, which are compatible
|
|
with both Windows and Unix (including Mac OS) unpacking. The actual
|
|
compression is implemented by @racket[deflate].}
|
|
|
|
@defproc[(zip [zip-file path-string?] [path path-string?] ...
|
|
[#:timestamp timestamp (or/c #f exact-integer?) #f]
|
|
[#:get-timestamp get-timestamp
|
|
(path? . -> . exact-integer?)
|
|
(if timestamp
|
|
(lambda (p) timestamp)
|
|
file-or-directory-modify-seconds)]
|
|
[#:utc-timestamps? utc-timestamps? any/c #f]
|
|
[#:round-timestamps-down? round-timestamps-down? any/c #f]
|
|
[#:path-prefix path-prefix (or/c #f path-string?) #f]
|
|
[#:system-type sys-type symbol? (system-type)])
|
|
void?]{
|
|
|
|
Creates @racket[zip-file], which holds the complete content of all
|
|
@racket[path]s.
|
|
|
|
The given @racket[path]s are all expected to be
|
|
relative path names of existing directories and files (i.e., relative
|
|
to the current directory). If a nested path is provided as a
|
|
@racket[path], its ancestor directories are also added to the
|
|
resulting @exec{zip} file, up to the current directory (using
|
|
@racket[pathlist-closure]).
|
|
|
|
Files are packaged as usual for
|
|
@exec{zip} files, including permission bits for both Windows and Unix
|
|
(including Mac OS). The permission bits are determined by
|
|
@racket[file-or-directory-permissions], which does not preserve the
|
|
distinction between owner/group/other permissions. Also, symbolic
|
|
links are always followed.
|
|
|
|
The @racket[get-timestamp] function is used to obtain the modification
|
|
date to record in the archive for a file or directory. Normally,
|
|
@exec{zip} archives record modification dates in local time, but if
|
|
@racket[utc-timestamps?] is true, then the UTC time is recorded.
|
|
Timestamps in @exec{zip} archives are precise only to two seconds; by
|
|
default, the time is rounded toward the future (like WinZip or PKZIP),
|
|
but time is rounded toward the past (like Java) if
|
|
@racket[round-timestamps-down?] is true.
|
|
|
|
The @racket[sys-type] argument determines the system type recorded in
|
|
the archive.
|
|
|
|
If @racket[path-prefix] is not @racket[#f], then it prefixes the name
|
|
of each path as it is written in the @exec{zip} file, and directory
|
|
entries are added for each element of @racket[path-prefix].
|
|
|
|
@history[#:changed "6.0.0.3"
|
|
@elem{Added the @racket[#:get-timestamp] and @racket[#:system-type] arguments.}
|
|
#:changed "6.0.1.12"
|
|
@elem{Added the @racket[#:path-prefix], @racket[#:utc-timestamps?], and
|
|
@racket[#:utc-timestamps-down?] arguments.}]}
|
|
|
|
|
|
|
|
@defproc[(zip->output [paths (listof path-string?)]
|
|
[out output-port? (current-output-port)]
|
|
[#:timestamp timestamp (or/c #f exact-integer?) #f]
|
|
[#:get-timestamp get-timestamp
|
|
(path? . -> . exact-integer?)
|
|
(if timestamp
|
|
(lambda (p) timestamp)
|
|
file-or-directory-modify-seconds)]
|
|
[#:utc-timestamps? utc-timestamps? any/c #f]
|
|
[#:round-timestamps-down? round-timestamps-down? any/c #f]
|
|
[#:path-prefix path-prefix (or/c #f path-string?) #f]
|
|
[#:system-type sys-type symbol? (system-type)])
|
|
void?]{
|
|
|
|
Zips each of the given @racket[paths], and packages it as a @exec{zip}
|
|
``file'' that is written directly to @racket[out]. Unlike
|
|
@racket[zip], the specified @racket[paths] are included without
|
|
closing over directories: if a
|
|
directory is specified, its content is not automatically added, and
|
|
nested directories are added without parent directories.
|
|
|
|
@history[#:changed "6.0.0.3"
|
|
@elem{Added the @racket[#:get-timestamp] and @racket[#:system-type] arguments.}
|
|
#:changed "6.0.1.12"
|
|
@elem{Added the @racket[#:path-prefix], @racket[#:utc-timestamps?], and
|
|
@racket[#:utc-timestamps-down?] arguments.}]}
|
|
|
|
|
|
@defboolparam[zip-verbose on?]{
|
|
|
|
A parameter that controls output during a @racket[zip]
|
|
operation. Setting this parameter to a true value causes @racket[zip]
|
|
to display to @racket[(current-error-port)] the filename that is
|
|
currently being compressed.}
|