Ekstrak file Zip secara rekursif dengan NodeJS

Halo Pembuat Kode 👋

Ini adalah upaya pertama saya untuk menulis posting teknis. Semoga bermanfaat.

Pernyataan masalah

Baru-baru ini, saya menemukan persyaratan di mana saya harus mengekstrak semua file zip yang ada di dalam file zip utama yang memiliki struktur folder acak dan folder mana pun dapat memiliki file zip di dalamnya di tingkat mana pun.

Menguraikan masalah

  1. Temukan Library untuk diekstraksi
  2. Ekstrak file zip utama yaitu demo.zip
  3. Temukan cara untuk melintasi seluruh struktur folder secara rekursif
  4. Kemudian ekstrak .zip setiap kali ditemukan.

Larutan

perpustakaan ekstrak-zip digunakan untuk mengekstrak file zip.

Metode untuk mengekstrak file zip

  • Dibutuhkan dua argumen masukan, sumber dan target. sumber harus jalur absolut dari file zip, target adalah tempat folder akan diekstraksi.
 async function extractZip ( source , target ) { try { await extract ( source , { dir : target }); console . log ( " Extraction complete " ); } catch ( err ) { console . log ( " Oops: extractZip failed " , err ); } }

Metode untuk melintasi folder secara rekursif

 const unzipFiles = async function ( dirPath ) { const files = fs . readdirSync ( dirPath ); await Promise . all ( files . map ( async ( file ) => { if ( fs . statSync ( dirPath + " / " + file ). isDirectory ()) { await unzipFiles ( dirPath + " / " + file ); } else { const fullFilePath = path . join ( dirPath , " / " , file ); const folderName = file . replace ( " .zip " , "" ); if ( file . endsWith ( " .zip " )) { zippedFiles . push ( folderName ); await extractZip ( fullFilePath , path . join ( dirPath , " / " , folderName )); await unzipFiles ( path . join ( dirPath , " / " , folderName )); } } }) ); };

Banyak aktivitas di cuplikan di atas. Mari memecahkan kode

  • dirPath : jalur ekstraksi file

  • Metode fs.readdirSync() digunakan untuk membaca konten direktori tertentu secara sinkron. Metode ini mengembalikan larik dengan semua nama file atau objek di direktori.

  • Sekarang, tantangan utamanya adalah melakukan loop melalui semua folder / file secara asynchronous. Kami tidak dapat menggunakan forEach karena tidak mendukung kata kunci async/await Sintaks tradisional for loop berfungsi dengan kata kunci await Tapi saya ingin menggunakan map metode array yang lebih umum map() .

  • Jika Anda menggunakan await dengan map() ia akan mengembalikan array promise. Oleh karena itu, untuk menyelesaikan semua janji, await Promise.all(arrayOfPromises) digunakan di sini.

  • Untuk rincian lebih lanjut tentang async/await di loop mengacu ini artikel yang indah

 if ( fs . statSync ( dirPath + " / " + file ). isDirectory ()) { await unzipFiles ( dirPath + " / " + file ); }
  • Untuk memeriksa apakah objek saat ini adalah file atau folder isDirectory() digunakan. Jika itu adalah folder, panggil metode yang sama lagi ie unzipFiles()
 else { const fullFilePath = path . join ( dirPath , " / " , file ); const folderName = file . replace ( " .zip " , "" ); if ( file . endsWith ( " .zip " )) { zippedFiles . push ( folderName ); await extractZip ( fullFilePath , path . join ( dirPath , " / " , folderName )); await unzipFiles ( path . join ( dirPath , " / " , folderName )); }
  • Jika file ditemukan maka kita akan memanggil metode extractZip() dengan source dan target dengan jalur absolutnya.

  • Jika kami tidak menentukan target , atau memberinya jalur saat ini, maka itu akan mengekstrak semua file di direktori saat ini itu sendiri. Tetapi saya ingin mengekstrak zip ke nama folder masing-masing.

  • Untuk mencapai ini, saya telah menyambung nama folder dari file .zip meneruskannya sebagai target ke metode extractZip()

  • Sekarang ada satu tangkapan lagi di baris terakhir yaitu

 await unzipFiles ( path . join ( dirPath , " / " , folderName ));
  • Karena ada kemungkinan bahwa file yang diekstrak juga dapat memiliki file zip di dalamnya, jadi segera setelah kami mengekstrak file apa pun, kami harus memanggil unzipFiles() untuk melintasi file yang diekstrak.

Outputnya akan –
Teks Alt

Terima kasih banyak telah membaca 🙏

Jika Anda menikmati artikel ini atau merasa terbantu, beri acungan jempol 👍

Jangan ragu untuk terhubung 👋

Twitter | LinkedIn

May 26, 2021

codeorayo

Ampuh! Ini rahasia mengembangkan aplikasi secara instan, tinggal download dan kembangkan. Gabung sekarang juga! Premium Membership [PRIVATE] https://premium.codeorayo.com

Leave a Reply

Your email address will not be published. Required fields are marked *