Mengerjakan sistem file

Selesai

Tailwind Traders meminta setiap tokonya menulis total penjualannya ke sebuah file dan mengirimkan file itu ke lokasi pusat. Untuk menggunakan file-file tersebut, perusahaan perlu membuat proses batch yang dapat bekerja dengan sistem file.

Di sini, Anda mempelajari cara menggunakan Node.js untuk membaca sistem file untuk menemukan file dan direktori.

Sertakan modul fs

Node.js menyediakan modul bawaan, fs (kependekan dari sistem file), untuk bekerja dengan sistem file. Karena ini adalah bagian dari runtime Node.js, Anda tidak perlu menginstalnya; Anda mereferensikannya seperti halnya dependensi lainnya.

Modul fs memiliki promises namespace layanan yang memiliki promise versi semua metode. promise Menggunakan namespace adalah cara yang disukai untuk bekerja dengan modul fs karena memungkinkan Anda untuk menggunakan async untuk menghindari kekacauan panggilan balik atau pemblokiran metode sinkron.

const fs = require("fs").promises;

Anda dapat menggunakan modul fs untuk melakukan berbagai operasi pada file dan direktori. Ini memiliki beberapa metode untuk dipilih. Untuk saat ini, kami akan fokus pada apa yang perlu Anda ketahui untuk bekerja dengan direktori.

Mencantumkan konten dalam direktori dengan fs.readdir

Salah satu tugas yang sering Anda lakukan dengan modul fs adalah mencantumkan atau menghitung konten dalam direktori. Misalnya, Tailwind Traders, memiliki folder akar yang disebut penyimpanan. Di folder itu ada subfolder yang diatur berdasarkan nomor toko. Di dalam folder tersebut, adalah file total penjualan. Strukturnya terlihat seperti ini:

📂 stores
    📄 sales.json
    📄 totals.txt
    📂 201
    📂 202

Untuk membaca konten folder, Anda dapat menggunakan metode asinkron readdir . Sebagian besar operasi pada modul fs memiliki opsi sinkron (pascapending dengan Sync) dan asinkron. Hasilnya dikembalikan dalam urutan alfanumerik.

const fs = require("fs").promises;

async function main() {
    const items = await fs.readdir("stores");
    console.log(items);
}
main();

Daftar item yang diurutkan alfanumerik terlihat seperti ini:

[ '201', '202', '203', '204' ]

Menentukan tipe konten dengan isDirectory

Saat Anda membaca konten direktori, Anda mendapatkan kembali folder dan file sebagai array string. Anda dapat menentukan string mana yang merupakan file dan mana yang merupakan direktori dengan meneruskan opsi withFileTypes. Opsi ini mengembalikan array Dirent objek alih-alih array string. Objek Dirent memiliki metode isFile dan isDirectory yang dapat Anda gunakan untuk menentukan jenis objek yang Anda hadapi.

const fs = require("fs").promises;

async function main() {
    const items = await fs.readdir("stores", { withFileTypes: true });
    for (let item of items) {
        const type = item.isDirectory() ? "folder" : "file";
        console.log(`${item.name}: ${type}`);
    }
}
main();

Daftar item yang diurutkan alfanumerik terlihat seperti ini:

201: folder
202: folder
203: folder
204: folder

Catatan tentang rekursi

Seringkali, Anda mungkin perlu bekerja dengan struktur direktori kompleks yang mencakup beberapa folder berlapis, masing-masing berpotensi berisi lebih banyak subfolder dan file. Dalam kasus seperti itu, Anda memerlukan cara untuk menavigasi melalui struktur seperti pohon ini untuk menemukan file tertentu.

Untuk mencapai hal ini, Anda dapat membuat fungsi yang mengidentifikasi apakah item adalah folder. Jika ya, fungsi kemudian mencari di dalam folder tersebut untuk lebih banyak file. Proses ini diulang untuk setiap folder yang ditemukan.

Ini dicapai dengan menggunakan teknik yang disebut rekursi, di mana fungsi memanggil dirinya sendiri untuk mencari dalam folder yang baru ditemukan. Ini memungkinkan program untuk "berjalan" melalui seluruh pohon direktori, mencapai ke setiap folder berlapis sampai semua folder telah dijelajahi.

const fs = require("fs").promises;

async function findFiles(folderName) {

    let results = []

    results.push(`${folderName}`);

    const items = await fs.readdir(folderName, { withFileTypes: true });

    for (const item of items) {
        if (item.isDirectory()) {

            // RECURSION - calling the function from within itself
            const resultsReturned = await findFiles(`${folderName}/${item.name}`);
            results = results.concat(resultsReturned);
        } else {
            results.push(`${folderName}/${item.name}`);
        }
    }

    return results;
}

findFiles("stores").then((results) => console.log(results));

Output-nya terlihat seperti:

[
  'stores',
  'stores/201',
  'stores/201/sales.json',
  'stores/202',
  'stores/202/sales.json',
  'stores/203',
  'stores/203/sales.json',
  'stores/204',
  'stores/204/sales.json'
]

Menggunakan lingkungan pengembangan yang telah ditentukan sebelumnya

Modul pelatihan ini menawarkan kontainer pengembangan, baik di browser atau untuk komputer lokal Anda. Kontainer ini menyediakan semua lingkungan yang diperlukan sehingga Anda dapat menggunakan modul pelatihan ini tanpa harus menginstal IDE atau Node.js. Anda tidak perlu tahu apa pun tentang kontainer untuk menyelesaikan modul pelatihan ini.

Uji pengetahuan Anda

1.

Manakah dari operasi berikut yang dapat Anda lakukan dengan modul fs?