如何使用 ruby​​zip 重命名 zip 文件中的文件和目录

发布于 2024-12-27 11:48:26 字数 1815 浏览 6 评论 0原文

我正在尝试重命名 zip 中的文件和目录。我尝试了三种不同的方法,但都不起作用。执行此操作的正确命令是什么?

以下是我的代码摘录:

require 'zip/zip'
...

def renaming_zip(zip_file)
  Zip::ZipFile.open(zip_file).each do |entry|

      if entry.name == "mimetype"
        puts "#{entry.name} is a file ? #{File.file? entry.name}"
        puts " class ? #{entry.class}"
        new_filename = "#{entry.name.gsub("mimetype", "#mimetype-new")}"
        #found_entry = entry.get_entry("mimetype")
        #found_entry.name = new_filename                               #1st try
        puts  " new filename  #{new_filename}"
        #File.rename(entry.name, new_filename)                         #2nd try
        #entry.rename(entry.name, new_filename)                   #3rd try
      end
  end
end

如果我在没有任何重命名试验命令的情况下执行,我会得到此输出,因此您可以看到该文件存在于 zip 中。它只是不是一个 File 类,而是一个 Zip::ZipEntry 类,并且我能够解析新名称。

mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new

第一次尝试(未注释),我收到此错误:

mimetype is a file ? false
class ? Zip::ZipEntry
Uncaught exception: undefined method `get_entry' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:45:in `block in renaming_zip'
...

第二次尝试(未注释),我收到此错误:

Uncaught exception: No such file or directory - (mimetype, #mimetype-new)
/Users/.../app/lib/zip_rename.rb:48:in `rename'
/Users/.../app/lib/zxp_rename.rb:48:in `block in renaming_zip'
...
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new

第三次尝试(未注释),我收到此错误:

mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
Uncaught exception: undefined method `rename' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:49:in `block in renaming_zip'
    ...

I'm trying to rename a file and a directory in a zip. I'd tried three different, all not working. What is the right command to do it?

Below is the excerpt of my code:

require 'zip/zip'
...

def renaming_zip(zip_file)
  Zip::ZipFile.open(zip_file).each do |entry|

      if entry.name == "mimetype"
        puts "#{entry.name} is a file ? #{File.file? entry.name}"
        puts " class ? #{entry.class}"
        new_filename = "#{entry.name.gsub("mimetype", "#mimetype-new")}"
        #found_entry = entry.get_entry("mimetype")
        #found_entry.name = new_filename                               #1st try
        puts  " new filename  #{new_filename}"
        #File.rename(entry.name, new_filename)                         #2nd try
        #entry.rename(entry.name, new_filename)                   #3rd try
      end
  end
end

if I execute without any renaming trial command, I get this output, so you can see the file exists in the zip. It's just not a File class, but a Zip::ZipEntry class, and I'm able to parse the new name.

mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new

with 1st try (uncommented), I get this error:

mimetype is a file ? false
class ? Zip::ZipEntry
Uncaught exception: undefined method `get_entry' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:45:in `block in renaming_zip'
...

with 2nd try (uncommented), I get this error:

Uncaught exception: No such file or directory - (mimetype, #mimetype-new)
/Users/.../app/lib/zip_rename.rb:48:in `rename'
/Users/.../app/lib/zxp_rename.rb:48:in `block in renaming_zip'
...
mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new

with 3rd try( uncommented), I get this error:

mimetype is a file ? false
class ? Zip::ZipEntry
new filename  #mimetype-new
Uncaught exception: undefined method `rename' for mimetype:Zip::ZipEntry
/Users/.../app/lib/zip_rename.rb:49:in `block in renaming_zip'
    ...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

守望孤独 2025-01-03 11:48:26

要重命名条目,请在条目上调用 rename。

第一次尝试失败,因为您正在 entry 上调用 get_entry,它应该位于 ZipFile 上。

第二次尝试失败,因为代码以双引号结束字符串。

new_filename = entry.name.gsub('mimetype', '#mimetype-new')

第三次尝试失败,因为对象是 mimetype:Zip::ZipEntry 而不是 Zip::ZipEntry

正确的方法是

new_filename = "#mimetype-new"

Zip::ZipFile.open(zip_file).each do |zipfile|
   files = zipfile.select(&:file?)
   files.each do |file|
      if entry.name == "mimetype"
        entry.rename(entry.name, new_filename)
      end
   end
end

To rename the entry call rename on the entry.

1st Attempt fails because you are calling get_entry on entry, it should be on ZipFile.

2nd Attempt fails because the code ends the string with double-quotes.

new_filename = entry.name.gsub('mimetype', '#mimetype-new')

3rd Attempt fails because the object is mimetype:Zip::ZipEntry and is not Zip::ZipEntry

The correct way to do it is

new_filename = "#mimetype-new"

Zip::ZipFile.open(zip_file).each do |zipfile|
   files = zipfile.select(&:file?)
   files.each do |file|
      if entry.name == "mimetype"
        entry.rename(entry.name, new_filename)
      end
   end
end
装迷糊 2025-01-03 11:48:26

要使用 rubyzip 重命名 zip 中的文件:

require 'zip'

old_name = 'mimetype'
new_filename = '#mimetype-new'

Zip::ZipFile.open(zip_file_path).each do |zipfile|
  files = zipfile.select(&:file?)
  file = files.find{|f| f.name == old_name}
  zipfile.rename(file.name, new_filename) if file
end

To rename file inside zip with rubyzip:

require 'zip'

old_name = 'mimetype'
new_filename = '#mimetype-new'

Zip::ZipFile.open(zip_file_path).each do |zipfile|
  files = zipfile.select(&:file?)
  file = files.find{|f| f.name == old_name}
  zipfile.rename(file.name, new_filename) if file
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文