Class: Zlib::GzipWriter
Overview
Zlib::GzipWriter is a class for writing gzipped files. GzipWriter should be used with an instance of IO, or IO-like, object.
Following two example generate the same result.
Zlib::GzipWriter.open('hoge.gz') do |gz|
gz.write 'jugemu jugemu gokou no surikire...'
end
File.open('hoge.gz', 'w') do |f|
gz = Zlib::GzipWriter.new(f)
gz.write 'jugemu jugemu gokou no surikire...'
gz.close
end
To make like gzip(1) does, run following:
orig = 'hoge.txt'
Zlib::GzipWriter.open('hoge.gz') do |gz|
gz.mtime = File.mtime(orig)
gz.orig_name = orig
gz.write IO.binread(orig)
end
NOTE: Due to the limitation of Ruby’s finalizer, you must explicitly close GzipWriter objects by Zlib::GzipWriter#close etc. Otherwise, GzipWriter will be not able to write the gzip footer and will generate a broken gzip file.
Class Method Summary collapse
-
.Zlib::GzipWriter.open(filename, level = nil, strategy = nil) {|gz| ... } ⇒ Object
Opens a file specified by
filename
for writing gzip compressed data, and returns a GzipWriter object associated with that file.
Instance Method Summary collapse
-
#<< ⇒ Object
call-seq: << string.
-
#comment= ⇒ Object
Specify the comment (
str
) in the gzip header. -
#flush(flush = nil) ⇒ Object
Flushes all the internal buffers of the GzipWriter object.
-
#Zlib::GzipWriter.new(io, level = nil, strategy = nil, options = {}) ⇒ Object
constructor
Creates a GzipWriter object associated with
io
. -
#mtime= ⇒ Object
Specify the modification time (
mtime
) in the gzip header. -
#orig_name= ⇒ Object
Specify the original name (
str
) in the gzip header. -
#pos ⇒ Object
Total number of input bytes read so far.
-
#print ⇒ Object
Same as IO.
-
#printf ⇒ Object
Same as IO.
-
#putc ⇒ Object
Same as IO.
-
#puts ⇒ Object
Same as IO.
-
#tell ⇒ Object
Total number of input bytes read so far.
-
#write ⇒ Object
Same as IO.
Methods inherited from GzipFile
#close, #closed?, #comment, #crc, #finish, #level, #mtime, #orig_name, #os_code, #sync, #sync=, #to_io, wrap
Constructor Details
#Zlib::GzipWriter.new(io, level = nil, strategy = nil, options = {}) ⇒ Object
Creates a GzipWriter object associated with io
. level
and strategy
should be the same as the arguments of Zlib::Deflate.new. The GzipWriter object writes gzipped data to io
. io
must respond to the write
method that behaves the same as IO#write.
The options
hash may be used to set the encoding of the data. :external_encoding
, :internal_encoding
and :encoding
may be set as in IO::new.
3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 |
# File 'zlib.c', line 3467
static VALUE
rb_gzwriter_initialize(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz;
VALUE io, level, strategy, opt = Qnil;
int err;
if (argc > 1) {
opt = rb_check_convert_type(argv[argc-1], T_HASH, "Hash", "to_hash");
if (!NIL_P(opt)) argc--;
}
rb_scan_args(argc, argv, "12", &io, &level, &strategy);
Data_Get_Struct(obj, struct gzfile, gz);
/* this is undocumented feature of zlib */
gz->level = ARG_LEVEL(level);
err = deflateInit2(&gz->z.stream, gz->level, Z_DEFLATED,
-MAX_WBITS, DEF_MEM_LEVEL, ARG_STRATEGY(strategy));
if (err != Z_OK) {
raise_zlib_error(err, gz->z.stream.msg);
}
gz->io = io;
ZSTREAM_READY(&gz->z);
rb_gzfile_ecopts(gz, opt);
if (rb_respond_to(io, id_path)) {
gz->path = rb_funcall(gz->io, id_path, 0);
rb_define_singleton_method(obj, "path", rb_gzfile_path, 0);
}
return obj;
}
|
Class Method Details
.Zlib::GzipWriter.open(filename, level = nil, strategy = nil) {|gz| ... } ⇒ Object
Opens a file specified by filename
for writing gzip compressed data, and returns a GzipWriter object associated with that file. Further details of this method are found in Zlib::GzipWriter.new and Zlib::GzipFile.wrap.
3448 3449 3450 3451 3452 |
# File 'zlib.c', line 3448
static VALUE
rb_gzwriter_s_open(int argc, VALUE *argv, VALUE klass)
{
return gzfile_s_open(argc, argv, klass, "wb");
}
|
Instance Method Details
#<< ⇒ Object
call-seq: << string
Inputs string
into the deflate stream just like Zlib::Deflate#deflate, but returns the Zlib::Deflate object itself. The output from the stream is preserved in output buffer.
#comment= ⇒ Object
Specify the comment (str
) in the gzip header.
3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 |
# File 'zlib.c', line 3232
static VALUE
rb_gzfile_set_comment(VALUE obj, VALUE str)
{
struct gzfile *gz = get_gzfile(obj);
VALUE s;
char *p;
if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
rb_raise(cGzError, "header is already written");
}
s = rb_str_dup(rb_str_to_str(str));
p = memchr(RSTRING_PTR(s), '\0', RSTRING_LEN(s));
if (p) {
rb_str_resize(s, p - RSTRING_PTR(s));
}
gz->comment = s;
return str;
}
|
#flush(flush = nil) ⇒ Object
Flushes all the internal buffers of the GzipWriter object. The meaning of flush
is same as in Zlib::Deflate#deflate. Zlib::SYNC_FLUSH
is used if flush
is omitted. It is no use giving flush Zlib::NO_FLUSH
.
3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 |
# File 'zlib.c', line 3508
static VALUE
rb_gzwriter_flush(int argc, VALUE *argv, VALUE obj)
{
struct gzfile *gz = get_gzfile(obj);
VALUE v_flush;
int flush;
rb_scan_args(argc, argv, "01", &v_flush);
flush = FIXNUMARG(v_flush, Z_SYNC_FLUSH);
if (flush != Z_NO_FLUSH) { /* prevent Z_BUF_ERROR */
zstream_run(&gz->z, (Bytef*)"", 0, flush);
}
gzfile_write_raw(gz);
if (rb_respond_to(gz->io, id_flush)) {
rb_funcall(gz->io, id_flush, 0);
}
return obj;
}
|
#mtime= ⇒ Object
Specify the modification time (mtime
) in the gzip header. Using a Fixnum or Integer
3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 |
# File 'zlib.c', line 3187
static VALUE
rb_gzfile_set_mtime(VALUE obj, VALUE mtime)
{
struct gzfile *gz = get_gzfile(obj);
VALUE val;
if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
rb_raise(cGzError, "header is already written");
}
val = rb_Integer(mtime);
gz->mtime = NUM2UINT(val);
return mtime;
}
|
#orig_name= ⇒ Object
Specify the original name (str
) in the gzip header.
3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 |
# File 'zlib.c', line 3208
static VALUE
rb_gzfile_set_orig_name(VALUE obj, VALUE str)
{
struct gzfile *gz = get_gzfile(obj);
VALUE s;
char *p;
if (gz->z.flags & GZFILE_FLAG_HEADER_FINISHED) {
rb_raise(cGzError, "header is already written");
}
s = rb_str_dup(rb_str_to_str(str));
p = memchr(RSTRING_PTR(s), '\0', RSTRING_LEN(s));
if (p) {
rb_str_resize(s, p - RSTRING_PTR(s));
}
gz->orig_name = s;
return str;
}
|
#pos ⇒ Object
Total number of input bytes read so far.
3352 3353 3354 3355 3356 |
# File 'zlib.c', line 3352
static VALUE
rb_gzfile_total_in(VALUE obj)
{
return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
}
|
#print ⇒ Object
Same as IO.
#printf ⇒ Object
Same as IO.
#putc ⇒ Object
Same as IO.
3549 3550 3551 3552 3553 3554 3555 3556 3557 |
# File 'zlib.c', line 3549
static VALUE
rb_gzwriter_putc(VALUE obj, VALUE ch)
{
struct gzfile *gz = get_gzfile(obj);
char c = NUM2CHR(ch);
gzfile_write(gz, (Bytef*)&c, 1);
return ch;
}
|
#puts ⇒ Object
Same as IO.
#tell ⇒ Object
Total number of input bytes read so far.
3352 3353 3354 3355 3356 |
# File 'zlib.c', line 3352
static VALUE
rb_gzfile_total_in(VALUE obj)
{
return rb_uint2inum(get_gzfile(obj)->z.stream.total_in);
}
|
#write ⇒ Object
Same as IO.
3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 |
# File 'zlib.c', line 3532
static VALUE
rb_gzwriter_write(VALUE obj, VALUE str)
{
struct gzfile *gz = get_gzfile(obj);
if (!RB_TYPE_P(str, T_STRING))
str = rb_obj_as_string(str);
if (gz->enc2 && gz->enc2 != rb_ascii8bit_encoding()) {
str = rb_str_conv_enc(str, rb_enc_get(str), gz->enc2);
}
gzfile_write(gz, (Bytef*)RSTRING_PTR(str), RSTRING_LEN(str));
return INT2FIX(RSTRING_LEN(str));
}
|