7zip-min
Version:
Standalone cross-platform zip/unzip with 7za
203 lines (161 loc) • 6.41 kB
Markdown
7zip-min
========
Minimal cross-platform pack/unpack (and any command) with **7-zip** for Node.js.
It does not require **7zip** to be installed in your system.
This package includes a standalone **7za** version of **7-Zip** (uses precompiled binaries from [7zip-bin](https://github.com/develar/7zip-bin) package).
Supporting archive formats
--------------------------
According to [Command Line Version User's Guide](https://web.mit.edu/outland/arch/i386_rhel4/build/p7zip-current/DOCS/MANUAL/) page, 7za supports only **7z**, **lzma**, **cab**, **zip**, **gzip**, **bzip2**, **Z** and **tar** formats.
Supporting platforms
--------------------
- win (32/64)
- mac
- arm64 (Apple Silicon)
- x64
- linux
- arm
- arm64
- ia32
- x64
To get more details, check [7zip-bin](https://github.com/develar/7zip-bin) package repo.
Package should work with Electron.
You will have to unpack the binary ([`asarUnpack`](https://www.electron.build/configuration#asarunpack) option if you use `electron-builder`.)
Usage
-----
You may use `pack` and `unpack` methods for simple packing/unpacking.
You can also use `list` to get an array with the file content properties (includes date, time, attr, size, compressed, and name)
Or use `cmd` to run 7za with custom parameters (see [Command Line Version User's Guide](https://web.mit.edu/outland/arch/i386_rhel4/build/p7zip-current/DOCS/MANUAL/))
You can use package with callbacks and in async way (with promises).
### Basic examples
```javaScript
const _7z = require('7zip-min');
// .......
await _7z.pack('path/to/dir/or/file', 'path/to/archive.7z');
await _7z.unpack('path/to/archive.7z', 'where/to/unpack');
const list = await _7z.list('path/to/archive.7z'); // list of items inside archive
const output = await _7z.cmd(['a', 'path/to/archive.7z', 'path/to/dir/or/file']); // run custom command
```
### Examples with callbacks and promises
#### unpack()
```javaScript
// unpack with callback
_7z.unpack('path/to/archive.7z', 'where/to/unpack', (err, output) => {
if (err) {
console.error('Error', err.message);
} else {
// everything is Ok
console.log('stdout of the 7za command execution', output); // output just in case you need it
}
});
// unpack with promise
_7z.unpack('path/to/archive.7z', 'where/to/unpack')
.then(output => console.log('stdout of the 7za command execution', output))
.catch(err => console.error('Error', err.message));
// unpack with async/await
(async () => {
try {
const output = await _7z.unpack('path/to/archive.7z', 'where/to/unpack');
console.log('stdout of the 7za command execution', output);
} catch (err) {
console.error('Error', err.message);
}
})();
// if no output directroy specified, it will unpack into the current directory (process.cwd())
_7z.unpack('path/to/archive.7z')
.then(output => console.log('stdout of the 7za command execution', output))
.catch(err => console.error('Error', err.message));
```
#### pack()
```javaScript
// pack with callback
_7z.pack('path/to/dir/or/file', 'path/to/archive.7z', (err, output) => {
if (err) {
console.error('Error', err.message);
} else {
// everything is Ok
console.log('stdout of the 7za command execution', output);
}
});
// pack with promise
_7z.pack('path/to/dir/or/file', 'path/to/archive.7z')
.then(output => console.log('stdout of the 7za command execution', output))
.catch(err => console.error('Error', err.message));
// pack with async/await
(async () => {
try {
const output = await _7z.pack('path/to/dir/or/file', 'path/to/archive.7z');
console.log('stdout of the 7za command execution', output);
} catch (err) {
console.error('Error', err.message);
}
})();
```
#### list()
```javaScript
// list with callback
_7z.list('path/to/archive.7z', (err, list) => {
if (err) {
console.error('Error', err.message);
} else {
console.log('List of items inside the archive', list);
// For each element in the archive you will have:
// name, date, time, attr, size (in bytes), compressed (compressed size in bytes), crc, method, encrypted, block
// Depending on the archive type some values may be empty or missed
}
});
// list with promise
_7z.list('path/to/archive.7z')
.then(list => console.log('List of items inside the archive', list))
.catch(err => console.error('Error', err.message));
// list with async/await
(async () => {
try {
const list = await _7z.list('path/to/archive.7z');
console.log('List of items inside the archive', list);
} catch (err) {
console.error('Error', err.message);
}
})();
```
#### cmd()
```javaScript
// cmd with callback
// in the first parameter you have to provide an array of parameters
// check 7z's Command Line Version User's Guide - https://web.mit.edu/outland/arch/i386_rhel4/build/p7zip-current/DOCS/MANUAL/
// the bellow command is equal to `7za a path/to/archive.7z path/to/dir/or/file` and will add `path/to/dir/or/file` to `path/to/archive.7z` archive
_7z.cmd(['a', 'path/to/archive.7z', 'path/to/dir/or/file'], (err, output) => {
if (err) {
console.error('Error', err.message);
} else {
// Execution finished succesfully
console.log('stdout of the 7za command execution', output);
}
});
// cmd with promise
_7z.cmd(['a', 'path/to/archive.7z', 'path/to/dir/or/file'])
.then(output => console.log('stdout of the 7za command execution', output))
.catch(err => console.error('Error', err.message));
// cmd with async/await
(async () => {
try {
const output = await _7z.cmd(['a', 'path/to/archive.7z', 'path/to/dir/or/file']);
console.log('stdout of the 7za command execution', output);
} catch (err) {
console.error('Error', err.message);
}
})();
```
### Custom 7za path
Sometimes, you may want to use a custom path to the 7za binary. See https://github.com/onikienko/7zip-min/pull/106 for more details.
```javaScript
// To find out the path to the 7za binary, you can use the getConfig() method
const config = _7z.getConfig();
console.log(`Path to 7za binary: ${config.binaryPath}`);
// To set a custom path to the 7za binary, you can use the config() method
_7z.config({
binaryPath: 'path/to/custom/7za'
});
```
Test
----
`npm test`