szip: add support for unpacking zip archives and simple zip files
parent
c11356be21
commit
9f7cf5cc37
|
@ -1007,6 +1007,10 @@ int zip_extract(const char *zipname, const char *dir,
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int zip_extract_without_callback(const char *zipname, const char *dir) {
|
||||||
|
return zip_extract(zipname, dir, NULL, NULL);
|
||||||
|
} // for simple V bind ¯\_(ツ)_/¯
|
||||||
|
|
||||||
int zip_extract_stream(const char *stream, size_t size, const char *dir,
|
int zip_extract_stream(const char *stream, size_t size, const char *dir,
|
||||||
int (*on_extract)(const char *filename, void *arg),
|
int (*on_extract)(const char *filename, void *arg),
|
||||||
void *arg) {
|
void *arg) {
|
||||||
|
|
|
@ -312,6 +312,8 @@ extern int zip_create(const char *zipname, const char *filenames[], size_t len);
|
||||||
extern int zip_extract(const char *zipname, const char *dir,
|
extern int zip_extract(const char *zipname, const char *dir,
|
||||||
int (*on_extract_entry)(const char *filename, void *arg),
|
int (*on_extract_entry)(const char *filename, void *arg),
|
||||||
void *arg);
|
void *arg);
|
||||||
|
// temporary working unzip solution
|
||||||
|
extern int zip_extract_without_callback(const char *zipname, const char *dir);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Extracts a zip archive stream into directory.
|
* Extracts a zip archive stream into directory.
|
||||||
|
|
|
@ -39,6 +39,8 @@ fn C.zip_entry_fread(&Zip, byteptr) int
|
||||||
|
|
||||||
fn C.zip_total_entries(&Zip) int
|
fn C.zip_total_entries(&Zip) int
|
||||||
|
|
||||||
|
fn C.zip_extract_without_callback(charptr, charptr) int
|
||||||
|
|
||||||
// CompressionLevel lists compression levels, see in "thirdparty/zip/miniz.h"
|
// CompressionLevel lists compression levels, see in "thirdparty/zip/miniz.h"
|
||||||
pub enum CompressionLevel {
|
pub enum CompressionLevel {
|
||||||
no_compression = 0
|
no_compression = 0
|
||||||
|
@ -201,16 +203,69 @@ pub fn (mut zentry Zip) extract_entry(path string) ? {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
extract extracts the current zip entry using a callback function (on_extract).
|
// extract zip file to directory
|
||||||
fn (mut zentry Zip) extract(path string) bool {
|
pub fn extract_zip_to_dir(file string, dir string) ?bool {
|
||||||
if C.access(path.str, 0) == -1 {
|
if C.access(dir.str, 0) == -1 {
|
||||||
return false
|
return error('szip: cannot open directory for extracting, directory not exists')
|
||||||
// return error('szip: cannot open directory for extracting, directory not exists')
|
|
||||||
}
|
}
|
||||||
res := C.zip_extract(zentry, path.str, 0, 0)
|
res := C.zip_extract_without_callback(charptr(file.str), charptr(dir.str))
|
||||||
return res == 0
|
return res == 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// zip files (full path) to zip file
|
||||||
|
pub fn zip_files(path_to_file []string, path_to_export_zip string) ? {
|
||||||
|
|
||||||
|
// open or create new zip
|
||||||
|
mut zip := szip.open(path_to_export_zip, .no_compression, .write) or { panic(err) }
|
||||||
|
|
||||||
|
// add all files from the directory to the archive
|
||||||
|
for file in path_to_file {
|
||||||
|
|
||||||
|
// add file to zip
|
||||||
|
zip.open_entry(os.base(file)) or { panic(err) }
|
||||||
|
file_as_byte := os.read_bytes(file) or { panic(err) }
|
||||||
|
zip.write_entry(file_as_byte) or { panic(err) }
|
||||||
|
|
||||||
|
zip.close_entry()
|
||||||
|
}
|
||||||
|
|
||||||
|
// close zip
|
||||||
|
defer {
|
||||||
|
zip.close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
TODO add
|
||||||
|
// zip all files in directory to zip file
|
||||||
|
pub fn zip_folder(path_to_dir string, path_to_export_zip string) {
|
||||||
|
|
||||||
|
// get list files from directory
|
||||||
|
files := os.ls(path_to_dir) or { panic(err) }
|
||||||
|
|
||||||
|
// open or create new zip
|
||||||
|
mut zip := szip.open(path_to_export_zip, .no_compression, .write) or { panic(err) }
|
||||||
|
|
||||||
|
// add all files from the directory to the archive
|
||||||
|
for file in files {
|
||||||
|
eprintln('Zipping $file to ${path_to_export_zip}...')
|
||||||
|
println(path_to_dir + file)
|
||||||
|
|
||||||
|
// add file to zip
|
||||||
|
zip.open_entry(file) or { panic(err) }
|
||||||
|
file_as_byte := os.read_bytes(path_to_dir + '/'+ file) or { panic(err) }
|
||||||
|
zip.write_entry(file_as_byte) or { panic(err) }
|
||||||
|
|
||||||
|
zip.close_entry()
|
||||||
|
}
|
||||||
|
|
||||||
|
// close zip
|
||||||
|
zip.close()
|
||||||
|
|
||||||
|
eprintln('Successfully')
|
||||||
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// total returns the number of all entries (files and directories) in the zip archive.
|
// total returns the number of all entries (files and directories) in the zip archive.
|
||||||
|
|
|
@ -2,12 +2,36 @@ import szip
|
||||||
import os
|
import os
|
||||||
|
|
||||||
fn test_szip() {
|
fn test_szip() {
|
||||||
mut z := szip.open('test_compile.zip', .best_speed, .write) or {
|
|
||||||
assert false
|
// create temp files for zip/unzip test
|
||||||
return
|
test_path := 'zip files'
|
||||||
}
|
test_out_zip := 'v_test_zip.zip'
|
||||||
defer {
|
|
||||||
z.close()
|
os.mkdir(test_path) or { panic(err) }
|
||||||
os.rm('test_compile.zip') or { }
|
os.write_file(test_path + os.path_separator + 'file_1.txt', 'file one') or { panic(err) }
|
||||||
|
os.write_file(test_path + os.path_separator + 'file_2.txt', 'file file two') or { panic(err) }
|
||||||
|
|
||||||
|
// get list files from directory
|
||||||
|
mut files := os.ls(test_path) or { panic(err) }
|
||||||
|
for mut file in files {
|
||||||
|
file = os.getwd() + os.path_separator + test_path + os.path_separator + *file
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// zip files
|
||||||
|
szip.zip_files(files, test_out_zip) or { panic(err) }
|
||||||
|
assert os.exists(test_out_zip)
|
||||||
|
|
||||||
|
// remove files before next test
|
||||||
|
os.rm(test_path + os.path_separator + 'file_1.txt') or { panic(err) }
|
||||||
|
os.rm(test_path + os.path_separator + 'file_2.txt') or { panic(err) }
|
||||||
|
|
||||||
|
// extract test
|
||||||
|
szip.extract_zip_to_dir(test_out_zip, test_path) or { panic(err) }
|
||||||
|
assert os.exists(test_path + os.path_separator + 'file_1.txt')
|
||||||
|
assert os.exists(test_path + os.path_separator + 'file_2.txt')
|
||||||
|
|
||||||
|
// clear temp files
|
||||||
|
// remove temp files and dir
|
||||||
|
os.rmdir_all (test_path) or { panic(err) }
|
||||||
|
os.rm(test_out_zip) or { }
|
||||||
}
|
}
|
Loading…
Reference in New Issue