Zlib::GzipWriter
class Zlib::GzipWriter
Parent:Zlib::GzipFile
Zlib :: GzipWriter 是一个用于编写 gzip 文件的类。GzipWriter 应该与 IO 或 IO 类对象的实例一起使用。
以下两个示例生成相同的结果。
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
为了使像 gzip(1)那样,运行以下内容:
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
注意:由于 Ruby 的终结器的限制,您必须通过 Zlib :: GzipFile#关闭等方式显式关闭 GzipWriter 对象。否则,GzipWriter 将无法编写gzip脚注并生成破损的 gzip 文件。
公共类方法
Zlib::GzipWriter.new(io, level = nil, strategy = nil, options = {}) Show source
创建与之关联的 GzipWriter 对象io
。level
并strategy
应该与 Zlib :: Deflate.new的参数相同。GzipWriter 对象将 gzip 数据写入io
。io
必须响应write
与 IO#写入行为相同的方法。
options
散列可以被用于设置数据的编码。:external_encoding
,:internal_encoding
并且:encoding
可以被设置为在 IO.new。
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
TypedData_Get_Struct(obj, struct gzfile, &gzfile_data_type, 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;
}
Zlib::GzipWriter.open(filename, level=nil, strategy=nil) { |gz| ... } Show source
打开由filename
写入 gzip 压缩数据指定的文件,并返回与该文件关联的 GzipWriter 对象。这个方法的更多细节可以在:: new 和 Zlib :: GzipFile.wrap 中找到。
static VALUE
rb_gzwriter_s_open(int argc, VALUE *argv, VALUE klass)
{
return gzfile_s_open(argc, argv, klass, "wb"
}
公共实例方法
<<(p1) Show source
文档方法:<<与 IO 相同。
#define rb_gzwriter_addstr rb_io_addstr
comment=(p1) Show source
str
在 gzip 标题中指定 comment()。
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) Show source
刷新 GzipWriter 对象的所有内部缓冲区。flush
含义与Zlib :: Deflate#deflate 中的含义相同。Zlib::SYNC_FLUSH
如果flush
省略则使用。给予冲洗是没有用的Zlib::NO_FLUSH
。
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=(p1) Show source
mtime
在 gzip 标题中指定修改时间()。使用整数。
在 gzip 头文件中设置 mtime 不会影响生成的文件的 mtime。扩展 gzip 文件的不同实用程序可能会使用 mtime 标头。例如,gunzip 实用工具可以使用该-N
标志将结果文件的 mtime 设置为标题中的值。默认情况下,许多工具会将展开文件的 mtime 设置为 gzip 文件的 mtime,而不是头中的 mtime。
如果您未设置 mtime,则默认值将是压缩开始时的时间。将值设置为0表示没有时间戳可用。
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=(p1) Show source
str
在 gzip 标题中指定原始名称()。
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() Show source
迄今为止读取的输入字节总数。
static VALUE
rb_gzfile_total_in(VALUE obj)
{
return rb_uint2inum(get_gzfile(obj)->z.stream.total_in
}
print(*args) Show source
与 IO 相同。
#define rb_gzwriter_print rb_io_print
printf(*args) Show source
与 IO 相同。
#define rb_gzwriter_printf rb_io_printf
putc(p1) Show source
与 IO 相同。
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(*args) Show source
与 IO 相同。
#define rb_gzwriter_puts rb_io_puts
tell() Show source
迄今为止读取的输入字节总数。
static VALUE
rb_gzfile_total_in(VALUE obj)
{
return rb_uint2inum(get_gzfile(obj)->z.stream.total_in
}
write(p1) Show source
与 IO 相同。
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)
RB_GC_GUARD(str
return INT2FIX(RSTRING_LEN(str)
}