Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在ruby中创建没有临时文件的zip文件?_Ruby_Zip_Temporary Files - Fatal编程技术网

如何在ruby中创建没有临时文件的zip文件?

如何在ruby中创建没有临时文件的zip文件?,ruby,zip,temporary-files,Ruby,Zip,Temporary Files,我用一些生成的内容创建了一个zip文件(换句话说:归档文件中的文件不存在,内容是在我的脚本中生成的) 我使用的脚本与此类似: #~ gem 'rubyzip', '=1.1.0' require 'zip/zip' zipname = 'test.zip' File.delete(zipname) if File.exists?(zipname) #delete previous version Zip::ZipFile.open(zipname, Zip::ZipFile::CREATE)

我用一些生成的内容创建了一个zip文件(换句话说:归档文件中的文件不存在,内容是在我的脚本中生成的)

我使用的脚本与此类似:

#~ gem 'rubyzip', '=1.1.0'
require 'zip/zip'

zipname = 'test.zip'
File.delete(zipname) if File.exists?(zipname) #delete previous version

Zip::ZipFile.open(zipname, Zip::ZipFile::CREATE) do |zipfile|
  1.upto(100) do |i| #Just some testfiles with content
    zipfile.get_output_stream("%08i.txt" % i) do |output_entry_stream| #Filename
          output_entry_stream.write("Testcontent %08i" % i)            #generated content
        end
      sleep 1  #sleep some time to see the temporary files
  end   #testdocs
end #ZipFile.open(zipname)
这很好,我得到了正确的数据在里面我的邮政编码


但是在zip创建过程中,我有很多临时文件。压缩完成后,这些文件会被删除,但在创建过程中,这些文件会干扰我。如果该过程引发异常,那么我必须手动删除它们

我在2.0.2版和1.1.0版(使用gem-rubyzip)中有这种行为

  • 我可以避免这个临时文件吗
  • 如果没有:我可以为他们确定一个(临时)文件夹吗
请参见“”中的答案

我改编了你的例子来证明它是有效的

require 'zip/zip'

zipname = 'test.zip'
File.delete(zipname) if File.exists?(zipname) #delete previous version

stringio = Zip::ZipOutputStream::write_buffer do |zio|
  1.upto(5) do |i| #Just some testfiles with content
    zio.put_next_entry("test#{i}.txt") #Filename
    zio.write("Testcontent %08i" % i)  #generated content
    sleep 1 #sleep some time to see the temporary files
  end
end
stringio.rewind #reposition buffer pointer to the beginning
File.new("test.zip","wb").write(stringio.sysread) #write buffer to zipfile

您需要zip兼容性,还是gzip就足够了?Ruby随附,可分别使用和轻松读取/写入gzip压缩文件:

require 'zlib'
Zlib::GzipWriter.open('foobar.gz') do |fo|
  fo.write "how now brown cow\n"
end
在命令行中:

$file foobar.gz
foobar.gz: gzip compressed data, from Unix, last modified: Fri May 30 08:56:58 2014
$gunzip foobar.gz
$cat foobar
how now brown cow
如果您需要创建包含多个文件的归档文件,Ruby的类可以提供帮助。由于zip和tar->gZip的工作方式不同,tar.gz文件比等效的.zip文件小


在给文件加焦油或压缩文件时,要非常小心地尝试在内存中缓冲。在开发中进行测试很容易,因为我们很少使用全尺寸文件,但是一旦代码进入生产环境,并且文件大小膨胀到天文数字大小,您的系统就会突然陷入内存紧张。我们通常处理GB范围内的文件,而试图压缩内存中的文件会使应用程序成为生产服务器上的坏公民。我不喜欢在深夜接到电话,只是为了听到我写的东西引起了问题,所以要保守,确保你的应用程序能够顺利完成任务。

这可能会帮助你:“文件在创建过程中会干扰我。”你知道你的操作系统会不断创建文件,并清理它们,您使用的大多数应用程序也是如此?这种行为会打扰你吗?处理您遇到的异常,Ruby也将能够自己清理。不使用临时文件将导致代码不可伸缩,因为很容易想象创建一个比可用RAM大的文件。@UriAgassi我的问题不是zip文件(我以后需要在目标目录中使用该文件),但是我想添加到它们中的文件。@theTinMan我生成了我的zip文件,在运行时我继续在同一个目录中工作。所以我不想有很多新文件。当然,我可以使用另一个工作目录并复制结果。但我认为应该有一个“只有记忆”的解决方案。使用peters解决方案,我现在需要的时间减少了1/3——这是我所希望的副作用;)我已经找到了你发布的答案,但我的问题不是zip文件本身,而是我添加的文件。当我测试代码时,没有临时文件。看来这也是我问题的解决办法。我看到了它,但没有确定它是解决方案。谢谢,我尝试了解决方案。它可以工作(在我在我的生产环境中更新rubyzip之后)。一个提示:如果生成的内容是来自AT的二进制文件,那么你应该使用
File.new(“test.zip”,“wb”)
(模式wb表示二进制文件,而不是w)。你忘了提到所需的Gem是
zip
我有大约30000个30-40MB的zip文件。我尝试了peters的解决方案,效果很好。而且我不期望调用,到目前为止,我只生成一次拉链,然后它们就被重用了。