-
Notifications
You must be signed in to change notification settings - Fork 1.2k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Write a .zip #1442
Comments
Maybe something like this?
You’d create a real or fake FileSystem, populate a directory with content, then create a .zip from that content. One drawback of this API is it’s awkward to create entries from a stream, like an HTTP response. |
Another option:
|
A couple more considerations:
I suspect these are a deal-breaker for the APIs that use a Here’s another API proposal. It ends up looking a lot like Moshi’s JsonUtf8Writer in name & usage. class ZipWriter(sink: BufferedSink) : Closeable {
inline fun <T> file(
file: Path,
compress: Boolean = true,
lastModifiedAtMillis: Long? = null,
lastAccessedAtMillis: Long? = null,
createdAtMillis: Long? = null,
writerAction: BufferedSink.() -> T,
): T
fun directory(
dir: Path,
lastModifiedAtMillis: Long? = null,
lastAccessedAtMillis: Long? = null,
createdAtMillis: Long? = null,
)
}
inline fun <T> BufferedSink.writeZip(writerAction: ZipWriter.() -> T): T And a usage example of the above: FileSystem.SYSTEM.write("greetings.zip".toPath()) {
writeZip {
file("hello.txt".toPath()) {
writeUtf8("Hello World")
}
directory("directory".toPath())
directory("directory/subdirectory".toPath())
file(
file = "directory/subdirectory/child.txt".toPath(),
compress = false,
lastModifiedAtMillis = Clock.System.now().toEpochMilliseconds(),
) {
writeUtf8("Another file!")
}
}
} |
I think I’d canonicalize input paths by stripping a leading |
I think I’d default timestamps to null/absent/0 rather than grabbing the host machine’s time and jamming that in there. Too many tools that produce |
I think I’d produce |
I think I’d stream output to a |
That API in #1442 (comment) looks really good and would suit most of my needs. I have a bunch of app of which you can export your data. Everything that is a table in my sqlite tables just gets a corresponding json file where I dump all the data. Media files such as videos/images are stored such that they preserve their relative path from class ZipWriter(sink: BufferedSink) : Closeable {
fun copy(
source: Source,
compress: Boolean = true,
): T
} Or would this just be achievable by something like this? file("attachments/image_1664623103090.jpg".toPath()) {
writeAll(fileSystem.source("attachments/image_1664623103090.jpg"))
} |
@vanniktech We could include all kinds of helpers, possibly as extensions.
|
Is there already some functionality to create a simple ZIP file of a directory or any ZIP file at all for native targets (iOS in my case)? |
@mipastgt not yet! |
Is there any progress in this feature? |
I was this close to giving it a shot, but my main issue is that I also wanted to have it working for JS/browser, and I've seen that I wonder what's okio's view on it, @swankjesse. I'd love to read/write zips on JS/Browser, Android, and mac/iOS. Sure, JS/Browser would need to have it working with an in-memory file system, like I recently had to write some file-related code for all of these targets and the only place where I had to write platform-specific code other than the in-outputs (paths for Android and native, Uint8Array for JS), was the zipping part. Having mobile development as my mother-tongue, it does feel weird to have it all in memory, but for JS/Browser it is just another day under the sun. |
I don’t think it’s appropriate for Okio to ship a zlib dependency for Kotlin/JS. |
Mostly because the delivery mechanisms are entirely different. One is orders of magnitude less sensitive to an additional megabyte than the other. |
Most practically, Kotlin/Native and Kotlin/JVM already include zlib. Kotlin/JS doesn’t. |
I find it disturbing that a few bytes more are used as an excuse and justification to exclude an important functionality which almost everybody will need sooner or later. You could also make this an optional download. One could also think about the whole web delivery mechanisms. I was thinking the build process would strip any unused code before packaging so that the bytes in the library don't matter. Otherwise the whole web platform doesn't make much sense for me if you can't build any sophisticated software just because everybody wants to save some bytes somewhere. |
Maybe this https://developer.mozilla.org/en-US/docs/Web/API/CompressionStream/CompressionStream could also be an option to implement this feature. It's supported in all major browsers. |
@mipastgt an optional download is a good option. Unfortunately CompressionStream doesn’t work for Okio because Okio is built as a blocking API, and CompressionStream is a non-blocking API. |
Then I'd opt for the optional download. By the way, compressed pako is just 58kB. |
We should design an API to create a .zip file.
See also:
#1408
The text was updated successfully, but these errors were encountered: