[RAILS] Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.

Aperçu

J'ai dû créer beaucoup de fichiers zip pour une certaine tâche, mais j'ai été sauvé en rencontrant ce joyau. Cet article présente quatre façons de travailler avec des fichiers zip à l'aide de ruby.

Version rubis

Ruby 2.4 ou supérieur

Installer la gemme

Ajouter à Gemfile

Gemfile


gem 'rubyzip'

Exécutez la commande suivante dans le terminal

terminal


bundle install

Utiliser correctement à 4 fins

1. Créez un fichier zip

Zip::OutputStream.open('example.zip') do |zos|
  zos.put_next_entry('first_file.txt')
  zos.puts 'hoge hoge'

  zos.put_next_entry('second_file.txt')
  zos.puts 'hoge again'
end

Utilisez une chaîne ou les données lues par le fichier comme argument de la méthode «put». Le contenu du fichier zip généré a la structure suivante.

example.zip
- first_file.txt
- second_file.txt

Le contenu de chaque fichier est le suivant.

first_file.txt


hoge hoge

second_file.txt


hoge again

2. Lisez le fichier zip

La méthode get_next_entry définit les fichiers dans le fichier zip les uns après les autres.

Zip::InputStream.open('example.zip') do |zis|
  entry = zis.get_next_entry
  print "First line of '#{entry.name} (#{entry.size} bytes):  "
  puts "'#{zis.gets.chomp}'"
  entry = zis.get_next_entry
  print "First line of '#{entry.name} (#{entry.size} bytes):  "
  puts "'#{zis.gets.chomp}'"
end

Si vous lisez le ʻexample.zip` généré dans ** 1 **, vous verrez ce qui suit.

terminal


First line of 'first_file.txt (10 bytes):  hoge hoge
First line of 'second_file.txt (11 bytes):  hoge again

3. Lisez le répertoire du fichier zip

Utilisez la méthode get_input_stream (entry) pour obtenir le ʻInputStream` pour chaque entrée.

zf = Zip::File.new('example.zip')
zf.each_with_index do |entry, index|
  puts "entry #{index} is #{entry.name}, size = #{entry.size}, compressed size = #{entry.compressed_size}"
end

Ce code source affiche les fichiers compressés «index», «nom», «taille», «taille_ compressée» dans un fichier zip.

Si vous lisez le ʻexample.zip` généré dans ** 1 **, vous verrez ce qui suit.

terminal


entry 0 is first_file.txt, size = 10, compressed size = 10
entry 1 is second_file.txt, size = 11, compressed size = 13

4. Modifiez le fichier zip

Modifiez directement le fichier zip

Ajoutez le fichier indiqué par chemin avec ʻadd (entrée, chemin) Renommer avecrenommer (entrée, nouveau_nom)`

Modifier le fichier généré par ** 1 **

Zip::File.open('example.zip') do |zip_file|
  zip_file.add('third_file.txt', 'third_file.txt')
  zip_file.rename('first_file.txt', 'first_file_rename.txt')
  zip_file.add('fourth_file.txt', 'fourth_file.txt')
end

Les fichiers suivants ont également été préparés.

third_file


hoge third

fourth_file


hogehoge fourth

Je vais essayer. Obtenez des informations en utilisant ** 3 **

terminal


entry 0 is second_file.txt, size = 11, compressed size = 13
entry 1 is third_file.txt, size = 10, compressed size = 12
entry 2 is first_file_rename.txt, size = 10, compressed size = 10
entry 3 is fourth_file.txt, size = 14, compressed size = 14

Le fichier zip généré a été modifié pour avoir la structure suivante:

example.zip
- second_file_txt
- third_file.txt
- first_file_rename.txt
- fourth_file.txt

Résumé

Cet article a présenté quatre façons de travailler avec des fichiers zip. Il existe d'autres méthodes utiles dans rubyzip, il est donc recommandé d'y jeter un œil.

référence

https://github.com/rubyzip/rubyzip

Recommended Posts

Si vous voulez créer un fichier zip avec Ruby, c'est rubyzip.
Je souhaite surveiller un fichier spécifique avec WatchService
Si vous souhaitez utiliser Mockito avec Kotlin, utilisez mockito-kotlin
Je veux faire une liste avec kotlin et java!
Je veux créer une fonction avec kotlin et java!
Apprendre Ruby avec AtCoder 13 Comment créer un tableau à deux dimensions
Je veux créer un fichier Parquet même en Ruby
Si vous souhaitez transformer une application Java en une image Docker, il est pratique d'utiliser jib.
Faites un jeu de frappe avec ruby
Comment faire un pot avec l'ancien Hadoop (hadoop-core-0.20.2-cdh3u6) dans Gradle: (Que faire si vous obtenez Impossible de développer ZIP ..)
Je veux créer un bouton avec un saut de ligne avec link_to [Note]
Je souhaite ajouter une fonction de navigation avec ruby on rails
Comment créer un fichier jar sans dépendances dans Maven
Faisons une application multiplateforme avec JRuby (génération de fichier jar)
Si vous osez comparer Integer avec "==" ...
Je souhaite télécharger un fichier sur Internet en utilisant Ruby et l'enregistrer localement (avec prudence)
L'histoire selon laquelle traiter d'anciennes dates est agaçante
Si vous souhaitez modifier les colonnes de la base de données, etc.
Je souhaite pouvoir lire des fichiers en utilisant refile avec administrate [rails6]
[Ruby] Je veux faire un saut de méthode!
[Rubiy] Je veux créer un tableau à partir d'une chaîne de caractères avec la méthode split. Et vice versa.
[Ruby] Lorsque vous souhaitez remplacer plusieurs caractères
Si vous utilisez SQLite avec VSCode, utilisez l'extension (comment voir le fichier binaire de sqlite3)
Si vous souhaitez séparer le traitement Spring Boot + Thymeleaf
Comment créer une fonction de messagerie LINE avec Ruby
Faisons un Bot LINE avec Ruby + Sinatra - Partie 2
Que faire si vous créez accidentellement un modèle
Faisons un Bot LINE avec Ruby + Sinatra - Partie 1
Si hash [: a] [: b] [: c] = 0 dans Ruby, je veux que vous étendiez récursivement même si la clé n'existe pas
[Ruby + Rails] Lorsque vous souhaitez vous inscrire dans la liste de diffusion de Mailchimp avec l'enregistrement de l'utilisateur
Que faire si vous avez installé Ruby avec rbenv mais que la version ne change pas
Comment demander un fichier CSV au format JSON avec jMeter
[Ruby] Comment diviser chaque requête GraphQL en fichiers
Que faire lorsqu'une exception java.io.IOException se produit dans GlassFish
[Débutant] Essayez de créer un jeu RPG simple avec Java ①
Si vous souhaitez étudier la programmation à l'université, allez en Australie
[# 3 Java] Lisez ceci si vous voulez étudier Java! ~ Sélectionné avec soin ~
Je souhaite créer un modèle spécifique d'ActiveRecord ReadOnly
[Facile] Comment formater automatiquement les fichiers Ruby erb avec vsCode
Lorsque vous souhaitez écrire explicitement OR ou AND avec ransack
Même en Java, je veux afficher true avec un == 1 && a == 2 && a == 3
docker-compose.yml lorsque vous voulez garder mysql en cours d'exécution avec docker
lombok.config lorsque vous voulez passer @Qualifier à @RequiredArgsConstructor avec lombok
Ce n'est pas un gros problème si vous comprenez que j'étais accro à recevoir du courrier avec Java Mail depuis Exchange Online
[Swift] Lorsque vous voulez savoir si le nombre de caractères dans String correspond à un certain nombre ...
Si vous êtes nouveau sur Rails et souhaitez faire votre propre validation, arrêtez-vous à ce doigt.
Si vous souhaitez simuler une méthode dans RSpec, vous devez utiliser la méthode allow pour mock et la méthode singleton.
Lors de l'installation d'un gem avec l'extension C dans Ruby, je veux le terminer rapidement en utilisant plusieurs cœurs de processeur comme make -j4
[Ruby] problème avec l'instruction if
Que faire si vous obtenez une erreur gcc dans Docker
Je veux accrocher la génération / ouverture d'un fichier journal avec log4j # FileAppender